#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
****************************************************************/