#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int f = 1, ans = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    ans = ans * 10 + c - '0';
    c = getchar();
  }
  return f * ans;
}
const int MAXN = 19;
int N, M, f[1 << MAXN], pre[1 << MAXN], W[MAXN], G[1 << MAXN], vis[MAXN],
    Sum[1 << MAXN];
vector<int> vec[MAXN];
int Ans[MAXN], g[1 << MAXN];
void print(int Sta) {
  if (!Sta) return;
  print(pre[Sta]);
  int now = Sta ^ pre[Sta];
  ++Ans[0];
  for (int i = 1; i <= N; i++)
    if (now & (1 << (i - 1))) Ans[i] = Ans[0];
  return;
}
int main() {
  N = read(), M = read();
  for (int i = 1; i <= M; i++) {
    int u = read(), v = read(), w = read();
    vec[u].push_back(v);
    W[u] += w, W[v] -= w;
    g[1 << (u - 1)] |= (1 << (v - 1));
  }
  for (int i = 0; i < (1 << N); i++)
    for (int j = 1; j <= N; j++)
      if (i & (1 << (j - 1))) g[i] |= g[(1 << (j - 1))];
  for (int i = 0; i < (1 << N); i++) {
    memset(vis, 0, sizeof(vis));
    for (int j = 1; j <= N; j++)
      if (i & (1 << (j - 1))) vis[j] = 1, Sum[i] += W[j];
    for (int j = 1; j <= N; j++)
      if (vis[j])
        for (auto v : vec[j]) {
          if (vis[v]) G[i] = 1;
        }
  }
  memset(f, 127 / 3, sizeof(f));
  f[0] = 0;
  for (int i = 1; i < (1 << N); i++) {
    for (int S = i; S; S = (S - 1) & i) {
      int Now = S ^ i, New = S;
      if (G[New] || ((g[i] & (i ^ ((1 << N) - 1))))) continue;
      int cur = f[Now] + Sum[((1 << N) - 1) ^ Now];
      if (f[i] > cur) pre[i] = Now, f[i] = cur;
    }
  }
  print((1 << N) - 1);
  for (int i = 1; i <= N; i++) printf("%d ", Ans[i]);
  printf("\n");
  return 0;
}
