rt
#include <bits/stdc++.h>
#define N 5010
using namespace std;
int w, n, m, head[N];
struct node {
int nex, to, val;
} e[N];
void add(int u, int v, int w) {
static int tot = 0;
e[++tot].to = v;
e[tot].val = w;
e[tot].nex = head[u];
head[u] = tot;
}
bool vis[N];
int dis[N], in[N];
bool spfa(int s) {
memset(dis, -1, sizeof(dis));
// memset(vis, false, sizeof(vis));
// memset(in, 0, sizeof(in));
queue<int> q;
dis[s] = 0;
vis[s] = true;
++in[s];
q.push(s);
while(!q.empty()) {
int x = q.front();
q.pop();
vis[x] = false;
for(int i = head[x]; i; i = e[i].nex) {
int to = e[i].to;
if(dis[to] < dis[x] + e[i].val) {
dis[to] = dis[x] + e[i].val;
if(!vis[to]) {
q.push(to);
vis[to] = true;
++in[to];
if(in[to] > n + 1)
return true; //有负环
}
}
}
}
return false;
}
int main() {
scanf("%d %d", &n, &m);
for(int i = 1, u, v, w; i <= m; ++i) {
scanf("%d %d %d", &u, &v, &w);
add(u, v, -w);
}
for(int i = 1; i <= n; ++i) add(0, i, 0);
if(spfa(0))
printf("NO");
else
for(int i = 1; i <= n; ++i) printf("%d ", dis[i]);
return 0;
}