#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct uio{
int from,to,que;
}edge[1001];
int road[1001],n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>edge[i].from>>edge[i].to>>edge[i].que;
memset(road,0x7F,sizeof road);
road[1]=0;
for(int i=1;i<=n-1;i++)
{
int check=0;
for(int j=1;j<=m;j++)
if(road[edge[j].to]>road[edge[j].from]+edge[j].que)
{
road[edge[j].to]=road[edge[j].from]+edge[j].que;
check=1;
}
if(check==0)
break;
}
for(int i=1;i<=m;i++)
if(road[edge[i].to]>road[edge[i].from]+edge[i].que)
{
printf("此图含有负权回路");
return 0;
}
for(int i=1;i<=n;i++)
cout<<road[i]<<" ";
cout<<endl;
return 0;
}