#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,head[20010],dis[20010],vis[20010],sum[20010];
struct qedge{
int to,nxt,quan;
}edge[20010];
queue<int> q;
void add(int x,int y,int z){
edge[++cnt].to = y;
edge[cnt].quan = z;
edge[cnt].nxt = head[x];
head[x] = cnt;
}
bool spfa(int x){
memset(dis,10000,sizeof dis);
q.push(x);
dis[x] = 0;
vis[x] = 1;
while(!q.empty()){
int u = q.front();
q.pop();
vis[u] = 0;
for(int i = head[u];i;i = edge[i].nxt){
int v = edge[i].to;
if(dis[v] > dis[u] + edge[i].quan){
dis[v] = dis[u] + edge[i].quan;
if(!vis[v]){
vis[v] = 1;
++sum[v];
if(sum[v] == n+1) return true;
q.push(v);
}
}
}
}
return false;
}
int main(){
cin>>n>>m;
for(int i = 1;i <= n;i++){
add(0,i,0);
}
for(int i = 1;i <= m;i++){
int a,b,c;
cin>>a>>b>>c;
add(b,a,c);
}
if(spfa(0)){
cout<<"NO";
return 0;
}
for(int i = 1;i <= n;i++){
cout<<dis[i]<<" ";
}
}