#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
const int manx = 1e6;
queue<int>q;
struct Edge{
int u;
int v;
int w;
int nxt;
};
Edge e[manx];
int head[manx],cnt,n,m;
void add(int u,int v,int w){
e[++cnt].nxt = head[u];
e[cnt].u = u;
e[cnt].v = v;
e[cnt].w = w;
head[u] = cnt;
}
int dis[manx],in[manx];
bool vis[manx];
bool spfa(int u){
memset(vis,false,sizeof(vis));
vis[u] = true;
memset(dis,-1,sizeof(dis));
dis[u] = 0;
memset(in,0,sizeof(in));
in[u] = 1;
q.push(u);
while(!q.empty()){
int k = q.front();
q.pop();
vis[k] = false;
for (int i = head[u];i;i = e[i].nxt){
int x = e[i].v;
int w = e[i].w;
if (dis[k] + w > dis[x])
{
dis[x] = dis[u] + w;
if(!vis[x]){
q.push(x);
vis[x] = true;
++in[x];
if(in[x] > n + 1){
return true;
}
}
}
}
return false;
}
}
int main(){
cin >> n >> m;
for(int i = 1;i <= m; i++){
int a,b,c;
cin >> a >> b >> c;
add(a,b,-c);
}
for(int i = 1;i <= n;i++)
add(0,i,0);
if(spfa(0)) cout<<"NO"<<endl;
else
for (int i = 1;i <= n; i++)
cout<<dis[i]<<" ";
return 0;
}