const MAXDATA=1000;
var
 a:array[0..100,0..100] of integer;
 dis:array[0..100] of integer;
 fg:array[0..100] of boolean;
 n,s,i,j,min:integer;

function remin(a,b:integer):integer;
begin
 if a<b then exit(a) else exit(b);
end;

procedure dijkstra(s:integer);
var
 i,j,k:integer;
begin
 for i:=0 to n do
  begin
   fg[s]:=true;
   for j:=0 to n do
    begin
     if (a[s,j]<>0) and (fg[j]=false) then
      dis[j]:=remin(dis[j],dis[s]+a[s,j]);
    end;

   //writeln('xxxx');
   min:=MAXDATA;
  for k:=0 to n do
   for j:=0 to n do
    if(a[k,j]<>0) and (fg[j]=false) then
     if min>dis[j] then
      begin
       min:=dis[j];
       s:=j;
      end;
  end;

end;

procedure output;
var
 i:integer;
begin
 for i:=0 to n do
  if i<>s then
   if dis[i]=MAXDATA then write('-1 ') else write(dis[i],' ');
end;

begin
 readln(n,s);
 dec(n);
 for i:=0 to n do
  for j:=0 to n do
   read(a[i,j]);

 fillchar(fg,sizeof(fg),false);
 for i:=0 to n do dis[i]:=MAXDATA;
 dis[s]:=0;
 dijkstra(s);
 output;
 //writeln('wwwwww');
end.

/**************************************************************
	Problem: 2165
	User: admin
	Language: Pascal
	Result: Wrong Answer
****************************************************************/