#include <fstream>
#include <queue>
#include <vector>
#define NMAX 50002
#define INF 500000000
using namespace std;
ifstream fin("bellmanford.in ");
ofstream fout("bellmanford.out");
void citire();
bool BF();
int n,start=1;
int cmin[NMAX];//costul drumului de cost mnim de la start la x
int nr[NMAX]; // de cate ori a fost actualizat costul drumului de cost minim de la start la x
struct varf{int x;int c;};
vector <varf> G[NMAX];
queue <int>C;
int main()
{ int i;
citire();
if(!BF())
fout<<"Ciclu negativ!";
else for(i=2;i<=n;i++)
if(cmin[i]==INF) fout<<-1<<' ';
else fout<<cmin[i]<<' ';
fout<<'\n';
return 0;
}
void citire()
{ int i,j,c,m,k;
fin>>n>>m;
varf aux;
for(k=0;k<m;k++)
{ fin>>i>>j>>c;
aux.x=j;aux.c=c;
G[i].push_back(aux);
}}
bool BF() //returnam 0 daca nu exista solutie
{//initializare
int i,vf;
for(i=1;i<=n;i++) cmin[i]=INF;
cmin[start]=0;
C.push(start);
while(!C.empty())
{
vf=C.front();
C.pop();
//parcurg lista de adiacenta a luivf
for(i=0;i<G[vf].size(); i++ )
if(cmin[G[vf][i].x]> cmin[vf]+G[vf][i].c)
{cmin[G[vf][i].x]= cmin[vf]+G[vf][i].c;
nr[G[vf][i].x]++;
if(nr[G[vf][i].x]==n) return 0;
C.push(G[vf][i].x);
}
}
return 1;
}