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