#include<iostream>
using namespace std;
int main(){
int n,m;
int i,j,k;
int t1,t2,t3;
int inf=9999;
cin>>n>>m;
int e[10][10];
//int *e=new int[n][n];
//初始化为无穷大
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
e[i][j]=inf;
//对角线初始化为0
for(i=1;i<=n;++i)
e[i][i]=0;
//读入数据
for(i=1;i<=m;++i){
cin>>t1>>t2>>t3;
e[t1][t2]=t3;
}
//Floyd 算法
for(k=1;k<=n;++k)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j){
if(e[i][j]>e[i][k]+e[k][j]&&e[i][k]<inf&&e[k][j]<inf)
e[i][j]=e[i][k]+e[k][j];
}
//输出
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
cout<<i<<" "<<j<<" "<<e[i][j]<<endl;
return 0;
}
using namespace std;
int main(){
int n,m;
int i,j,k;
int t1,t2,t3;
int inf=9999;
cin>>n>>m;
int e[10][10];
//int *e=new int[n][n];
//初始化为无穷大
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
e[i][j]=inf;
//对角线初始化为0
for(i=1;i<=n;++i)
e[i][i]=0;
//读入数据
for(i=1;i<=m;++i){
cin>>t1>>t2>>t3;
e[t1][t2]=t3;
}
//Floyd 算法
for(k=1;k<=n;++k)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j){
if(e[i][j]>e[i][k]+e[k][j]&&e[i][k]<inf&&e[k][j]<inf)
e[i][j]=e[i][k]+e[k][j];
}
//输出
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
cout<<i<<" "<<j<<" "<<e[i][j]<<endl;
return 0;
}