/*
枚举顶点k范围[1,n]
以k为中介点,枚举所有定点对i和j.i和j的范围[1,n]
if(dis[i][k]+dis[k][j]<dis[i][j])
dis[i][j]=dis[i][k]+dis[k][j];
*/
#include<cstdio>
#include<algorithm>
using namespace std;
const int INF = 0xFFFFFFF;
const int MAXV = 200;
int n,m;
int dis[MAXV][MAXV];
void Floyd()
{
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(dis[i][k]!=INF && dis[k][j]!=INF && dis[i][k]+dis[k][j]<dis[i][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
int main(void)
{
int u,v,w;
fill(dis[0],dis[0]+MAXV*MAXV,INF);
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) dis[i][i]=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
dis[u][v]=w;
}
Floyd();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",dis[i][j]);
}
printf("\n");
}
return 0;
}
/*
input:
6 8
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
output:
0 1 5 3 4 6
268435455 0 4 2 5 5
268435455 268435455 0 268435455 268435455 1
268435455 268435455 2 0 3 3
268435455 268435455 268435455 268435455 0 3
268435455 268435455 268435455 268435455 268435455 0
*/