#include <bits/stdc++.h>
inline long long ceil_div(long long a, long long b) { return (a + b - 1) / b; }
using namespace std;
inline int qr() {
  int f = 0, fu = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') fu = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    f = (f << 3) + (f << 1) + (c & 15);
    c = getchar();
  }
  return f * fu;
}
const int N = 25, M = 3e5 + 10;
const long long INF = 1e15;
struct DINIC {
  int head[N * N], ver[M << 1], Next[M << 1], d[N * N];
  int s, t, tot = 1, n;
  long long edge[M], mxf;
  queue<int> q;
  inline void init() {
    memset(head, 0, sizeof(int) * (n + 1));
    tot = 1, mxf = n = 0;
  }
  inline void add(int x, int y, long long z) {
    n = max({n, x, y});
    ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot;
    ver[++tot] = x, edge[tot] = 0, Next[tot] = head[y], head[y] = tot;
  }
  inline bool bfs() {
    memset(d, 0, sizeof(int) * (n + 1));
    while (!q.empty()) q.pop();
    q.push(s), d[s] = 1;
    while (!q.empty()) {
      int x = q.front();
      q.pop();
      for (int i = head[x]; i; i = Next[i])
        if (edge[i] && !d[ver[i]]) {
          q.push(ver[i]);
          d[ver[i]] = d[x] + 1;
          if (ver[i] == t) return true;
        }
    }
    return false;
  }
  long long dinic(int x, long long flow) {
    if (x == t) return flow;
    long long rest = flow;
    for (int i = head[x]; i && rest; i = Next[i])
      if (edge[i] && d[ver[i]] == d[x] + 1) {
        long long k = dinic(ver[i], min(rest, edge[i]));
        if (!k) d[ver[i]] = 0;
        edge[i] -= k, edge[i ^ 1] += k, rest -= k;
      }
    return flow - rest;
  }
  inline long long solve() {
    long long flow;
    while (bfs())
      while ((flow = dinic(s, INF))) mxf += flow;
    return mxf;
  }
} D;
bool v[N * N];
inline void bfs() {
  queue<int> q;
  q.push(D.s);
  while (!q.empty()) {
    int x = q.front();
    v[x] = true, q.pop();
    for (int i = D.head[x]; i; i = D.Next[i])
      if (D.edge[i] && !v[D.ver[i]]) v[D.ver[i]] = true, q.push(D.ver[i]);
  }
}
int n, m;
int id[N][N], cnt = 1;
int val[N];
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
    for (int j = 0; j <= n; j++) id[i][j] = cnt++;
  D.init(), D.s = 1, D.t = cnt + 1;
  for (int i = 1; i <= m; i++) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    val[x] += z, val[y] -= z;
    for (int j = 0; j < n; j++) D.add(id[y][j], id[x][j + 1], INF);
  }
  for (int i = 1; i <= n; i++) {
    D.add(D.s, id[i][0], INF);
    D.add(id[i][n], D.t, INF);
    for (int j = 0; j < n; j++)
      D.add(id[i][j], id[i][j + 1], (int)1e9 + val[i] * j);
  }
  D.solve(), bfs();
  for (int i = 1; i <= n; i++) {
    int j = 0;
    while (v[id[i][j + 1]]) j++;
    printf("%d%c", j, i == n ? '\n' : ' ');
  }
  return 0;
}
