#include <stdio.h>
#include <string.h>
int edge[51][51],isvisited[51],n,m,s,lowcost[51];
void dijkstra(int vo){
int i,j,min,pre;
isvisited[vo]=1;
for (i=0;i<n;i++)
{
lowcost[i]=edge[vo][i];
}
lowcost[vo]=0;
pre=vo;
for (i=1;i<n;i++)
{
min=100000000;
for (j=0;j<n;j++)
{
if (isvisited[j]==0&&min>lowcost[j])
{
min=lowcost[j];
pre=j;
}
}
isvisited[pre]=1;
for (j=0;j<n;j++)
{
if (isvisited[j]==0&&lowcost[j]>edge[pre][j]+lowcost[pre])
{
lowcost[j]=edge[pre][j]+lowcost[pre];
}
}
}
}
int main(){
int i,j;
// freopen("1.txt","r",stdin);
while (scanf("%d %d",&n,&s)!=EOF)
{
memset(isvisited,0,sizeof(isvisited));
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
scanf("%d",&edge[i][j]);
if (edge[i][j]==0)
{
edge[i][j]=100000000;
}
}
}
dijkstra(s);
for (i=0;i<n;i++)
{
if (i!=s)
{
if (lowcost[i]==100000000)
{
printf("-1 ");
}else{
printf("%d ",lowcost[i]);
}
}
}
printf("\n");
}
// fclose(stdin);
return 0;
}
/**************************************************************
Problem: 2165
User: admin
Language: C
Result: Accepted
Time:9 ms
Memory:1156 kb
****************************************************************/