#include <bits/stdc++.h>
using namespace std;
template <typename T>
void read(T& x) {
  x = 0;
  char ch = getchar();
  long long f = 1;
  while (!isdigit(ch)) {
    if (ch == '-') f *= -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - 48;
    ch = getchar();
  }
  x *= f;
}
template <typename T, typename... Args>
void read(T& first, Args&... args) {
  read(first);
  read(args...);
}
template <typename T>
void write(T arg) {
  T x = arg;
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  if (x > 9) {
    write(x / 10);
  }
  putchar(x % 10 + '0');
}
template <typename T, typename... Ts>
void write(T arg, Ts... args) {
  write(arg);
  if (sizeof...(args) != 0) {
    putchar(' ');
    write(args...);
  }
}
using namespace std;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
const long long N = 1e6 + 5;
long long id[25][25];
long long head[N], cnt = 0, tot = 0;
struct node {
  long long t, c, next;
} edge[N];
void add(long long f, long long t, long long c) {
  edge[cnt].t = t;
  edge[cnt].c = c;
  edge[cnt].next = head[f];
  head[f] = cnt++;
}
void addedge(long long f, long long t, long long c) {
  add(f, t, c);
  add(t, f, 0);
}
const long long INF = 1ll << 60;
long long n, m, ed, st, cur[N], level[N];
long long a[N];
long long vis[N];
void dfs2(long long u) {
  vis[u] = 1;
  for (long long i = head[u]; i != -1; i = edge[i].next) {
    if (edge[i].c && !vis[edge[i].t]) dfs2(edge[i].t);
  }
}
bool DinicBfs(long long s, long long e) {
  memset(level, 0, sizeof(level));
  queue<long long> q;
  q.push(s);
  level[s] = 1;
  while (!q.empty()) {
    long long root = q.front();
    q.pop();
    for (long long i = head[root]; i != -1; i = edge[i].next) {
      long long v = edge[i].t, c = edge[i].c;
      if (!level[v] && c > 0) {
        level[v] = level[root] + 1;
        q.push(v);
      }
    }
  }
  return level[e] != 0;
}
long long DinicDfs(long long root, long long flow) {
  if (root == ed) return flow;
  long long newflow, cost = 0;
  for (long long& i = cur[root]; i != -1; i = edge[i].next) {
    long long v = edge[i].t, c = edge[i].c;
    if (level[v] == level[root] + 1 && c > 0 &&
        (newflow = DinicDfs(v, min(c, flow - cost)))) {
      cost += newflow;
      edge[i].c -= newflow;
      edge[i ^ 1].c += newflow;
      if (cost == flow) break;
    }
  }
  return cost;
}
long long Dinic() {
  long long ans = 0;
  while (DinicBfs(st, ed)) {
    for (long long i = st; i <= tot; i++) cur[i] = head[i];
    while (long long add = DinicDfs(st, INF)) ans += add;
  }
  return ans;
}
signed main() {
  memset(head, -1, sizeof(head));
  cin >> n >> m;
  st = ++tot, ed = ++tot;
  for (long long i = 1; i <= n; i++)
    for (long long j = 0; j <= n; j++) id[i][j] = ++tot;
  for (long long i = 1; i <= m; i++) {
    long long u, v, w;
    cin >> u >> v >> w;
    a[u] += w;
    a[v] -= w;
    for (long long j = 0; j < n; j++) addedge(id[v][j], id[u][j + 1], INF);
  }
  for (long long i = 1; i <= n; i++) {
    addedge(st, id[i][0], INF);
    addedge(id[i][n], ed, INF);
    for (long long j = 0; j < n; j++)
      addedge(id[i][j], id[i][j + 1], a[i] * j + 4e11);
  }
  Dinic();
  dfs2(st);
  for (long long i = 1; i <= n; i++) {
    long long ans = 0;
    for (long long j = n; j >= 0; j--)
      if (vis[id[i][j]]) {
        cout << j << ' ';
        break;
      }
  }
  cout << endl;
}
