#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <list>
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
#define inf INT_MAX/2
void citire(list<pair<int,int> > *&E, int &n, int &p, int &m)
{
fin>>n>>m;
E=new list< pair <int, int> > [n+1];
int x,y,c,i;
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
E[x].push_back(make_pair(y,c));
cout<<"1";
}
}
void initializare(int n, vector<int> &t, vector<int> &d, int p,vector<int> &viz, vector<int> &esteincoada)
{
int i;
t.resize(n+1);
d.resize(n+1);
viz.resize(n+1);
esteincoada.resize(n+1);
for(i=1;i<=n;i++)
{
t[i]=-1;
d[i]=inf;
viz[i]=0;
esteincoada[i]=0;
}
d[p]=0;
}
void Dijkstra(list<pair<int,int> > * E,int n, vector<int> &t, vector<int> &d, int p,vector<int> &viz, vector<int> &esteincoada, int &ok)
{
queue<int> Q;
ok=1;
initializare(n,t,d,p,viz,esteincoada);
int u,x,c;
Q.push(p);
esteincoada[p]=1;
while(!Q.empty())
{
u=Q.front();
viz[u]++;
if(viz[u]>=n)
{
ok=0;
return;
}
Q.pop();
esteincoada[u]=0;
for(auto i: E[u])
{
x=i.first;
c=i.second;
if(d[x]>d[u]+c)
{
d[x]=d[u]+c;
if(!esteincoada[x]);
Q.push(x);
}
}
}
}
int main()
{
list<pair<int,int> > *E;
vector<int> t,d, viz, esteincoada;
int n,p,ok,m;
citire(E,n,p,m);
Dijkstra(E,n,t,d,1,viz,esteincoada,ok);
if(ok==0)
cout<<"Ciclu negativ";
else
for(int i=2;i<=n;i++)
fout<<d[i]<<" ";
return 0;
}