#include <bits/stdc++.h>
using namespace std;
int n, m, p, k;
int id[20][20], head[410], cur[410], o = 1, cnt = 0, S, T, dep[410];
long long w[20];
bool vis[410];
struct edge {
  int to, link;
  long long w;
} e[10010];
void add_edge(int u, int v, long long w) {
  e[++o].to = v, e[o].link = head[u], head[u] = o, e[o].w = w;
  e[++o].to = u, e[o].link = head[v], head[v] = o, e[o].w = 0;
}
queue<int> q;
bool bfs() {
  for (int i = 1; i <= cnt; i++) dep[i] = 0, cur[i] = head[i];
  q.push(S), dep[S] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i; i = e[i].link) {
      if (dep[e[i].to] || !e[i].w) continue;
      dep[e[i].to] = dep[u] + 1;
      q.push(e[i].to);
    }
  }
  return dep[T];
}
long long dfs(int u, long long in) {
  if (u == T) return in;
  long long out = 0;
  for (int i = cur[u]; i; i = e[i].link, cur[u] = i) {
    if (dep[e[i].to] != dep[u] + 1 || !e[i].w) continue;
    long long res = dfs(e[i].to, min(in, e[i].w));
    e[i].w -= res;
    e[i ^ 1].w += res;
    in -= res;
    out += res;
  }
  if (!out) dep[u] = 0;
  return out;
}
void work(int u) {
  if (vis[u]) return;
  vis[u] = true;
  for (int i = head[u]; i; i = e[i].link) {
    if (e[i].w) work(e[i].to);
  }
}
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;
  for (int i = 1, u, v, W; i <= m; i++) {
    scanf("%d%d%d", &u, &v, &W);
    w[u] += W, w[v] -= W;
    for (int j = 0; j < n; j++) add_edge(id[v][j], id[u][j + 1], 1e18);
  }
  S = ++cnt, T = ++cnt;
  for (int i = 1; i <= n; i++) {
    add_edge(S, id[i][0], 1e18), add_edge(id[i][n], T, 1e18);
    for (int j = 0; j < n; j++)
      add_edge(id[i][j], id[i][j + 1], w[i] * j + 2e11);
  }
  while (bfs()) dfs(S, 1e18);
  work(S);
  for (int i = 1; i <= n; i++) {
    int ans = 0;
    for (int j = 0; j <= n; j++)
      if (vis[id[i][j]]) ans = j;
    printf("%d ", ans);
  }
}
