#include <bits/stdc++.h>
#pragma GCC optimize("O3,no-stack-protector")
#pragma GCC target( \
    "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
using namespace std;
int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int vc, ec;
  cin >> vc >> ec;
  vector<int> graph(vc, 0);
  vector<int> cv(vc, 0);
  for (int e = 0; e < ec; ++e) {
    int x, y, w;
    cin >> x >> y >> w;
    --x;
    --y;
    cv[x] += w;
    cv[y] -= w;
    graph[x] |= (1 << y);
  }
  vector<int> sm(1 << vc, 0);
  for (int m = 0; m < (1 << vc); ++m) {
    for (int v = 0; v < vc; ++v)
      if ((m >> v) & 1) {
        sm[m] += cv[v];
      }
  }
  vector<int> edge_from(1 << vc, 0);
  vector<int> anticlique(1 << vc, true);
  for (int m = 0; m < (1 << vc); ++m) {
    for (int v = 0; v < vc; ++v)
      if ((m >> v) & 1) {
        edge_from[m] |= graph[v];
      }
    if (edge_from[m] & m) {
      anticlique[m] = false;
    }
  }
  vector<pair<int, int>> val(1 << vc, {INT_MAX, 0});
  val[0].first = 0;
  for (int m = 1; m < (1 << vc); ++m) {
    for (int s = m; s != 0; s = (s - 1) & m) {
      if (anticlique[s] and (m & edge_from[s]) == 0) {
        val[m] = min(val[m], make_pair(val[m ^ s].first + sm[m ^ s], s));
      }
    }
  }
  int m = (1 << vc) - 1;
  int c = 0;
  vector<int> res(vc);
  while (m != 0) {
    int s = val[m].second;
    for (int v = 0; v < vc; ++v)
      if ((s >> v) & 1) {
        res[v] = c;
      }
    c++;
    m ^= s;
  }
  for (auto&& e : res) {
    cout << e << ' ';
  }
  cout << '\n';
  return 0;
}
