#define MAXN 5005 #define MAXM 10005 using namespace std; int read() { int ans = 0, sgn = 1; char c = getchar(); while (!isdigit(c)) { if (c == '-') sgn *= -1; c = getchar(); } while (isdigit(c)) { ans = ans * 10 + c - '0'; c = getchar(); } return ans * sgn; } int cnt_edge, head[MAXN]; struct { int to, next, w; } edges[MAXM]; void add_edge(int from, int to, int w) { edges[++cnt_edge].next = head[from]; edges[cnt_edge].to = to; edges[cnt_edge].w = w; head[from] = cnt_edge; } bool inqueue[MAXN]; int cnt[MAXN], dis[MAXN]; queue<int> Q; bool SPFA(int s, int n) { memset(dis, 127, sizeof(dis)); // memset(dis, -127, sizeof(dis)); dis[s] = 0; Q.push(s); while (!Q.empty()) { int p = Q.front(); if (cnt[p] > n) return false; Q.pop(); inqueue[p] = false; for (int eg = head[p]; eg != 0; eg = edges[eg].next) { int to = edges[eg].to; if (edges[eg].w + dis[p] < dis[to]) // if (edges[eg].w + dis[p] > dis[to]) { dis[to] = edges[eg].w + dis[p]; if (!inqueue[to]) { Q.push(to); inqueue[to] = true; cnt[to]++; } } } } return true; } int main() { int n = read(), m = read(); for (int i = 0; i < m; ++i) { int x = read(), y = read(), w = read(); add_edge(y, x, w); // add_edge(x, y, -w); } for (int i = 1; i <= n; ++i) add_edge(0, i, 0); if (SPFA(0, n)) { for (int i = 1; i <= n; ++i) printf("%d ", dis[i]); } else puts("NO"); return 0; }