program saddasdasdasd;
const infinit=maxint;
type vect=array[1..1000]of integer;
mat=array[1..1000,1..1000]of integer;
var d,tata:mat;
n,m,cost,i,j,k,x,y,start,finish:integer;
f,g:text;
procedure initializare;
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do begin
if i<>j then d[i,j]:=infinit
else d[i,j]:=0;
tata[i,j]:=0;
end;
for i:=1 to m do begin
readln(f,x,y,cost);
d[x,y]:=cost; d[y,x]:=cost;
tata[i,j]:=i; tata[j,i]:=j;
end;
end;
procedure drumuri(d,tata:mat);
begin
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if (d[i,k]<>infinit)and(d[k,j]<>infinit) then
if d[i,j]>d[i,k]+d[k,j] then
begin
d[i,j]:=d[i,k]+d[k,j];
tata[i,j]:=tata[k,j];
end;
end;
procedure afisare_drum;
var dr:vect; lg,i:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do write(g,d[i,j],' ');
writeln(g);
end;
end;
begin
assign(f,'d-fw.in');reset(f);
assign(g,'d-fw.out');rewrite(g);
readln(f,n,m);
initializare;
drumuri(d,tata);
afisare_drum;
close(f);close(g);
end.