#include <bits/stdc++.h>
#define LL long long
#define PII pair<int, int>
#define PLL pair<LL, LL>
#define all_of(v) (v).begin(), (v).end()
#define sort_unique(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define fi first
#define se second
const int MAXN = 20;
const LL INF = (LL) 3e18 + 8763;
//const LL MOD = (LL) 1e9 + 7;
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

struct Edge {
	int to;
	LL w;
};

int hei[MAXN], from[MAXN][1 << MAXN], ans[MAXN], is_valid[1 << MAXN], dep[1 << MAXN], ssmask[1 << MAXN];
LL n, m, fsum[MAXN], tsum[MAXN], sum[1 << MAXN], dp[MAXN][1 << MAXN];
vector<int> G[MAXN];

int dfs(int v) {
	if (hei[v] != -1) return hei[v];
	hei[v] = 0;
	for (int to : G[v]) {
		dfs(to);
		hei[v] = max(hei[v], hei[to] + 1);
	}
	return hei[v];
}

void solve() {
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		u--; v--;
		G[u].push_back(v);
		fsum[u] += w;
		tsum[v] += w;
	}
	
	for (int i = 0; i < n; i++) {
		hei[i] = -1;
	}
	for (int i = 0; i < n; i++) {
		dfs(i);
	}
		
	for (int i = 0; i < (1 << n); i++) {
		is_valid[i] = 1;
		for (int j = 0; j < n; j++) {
			if (i >> j & 1) {
				dep[i] = max(dep[i], hei[j]);
				sum[i] += fsum[j] - tsum[j];
				for (int to : G[j]) {
					if (~i >> to & 1) {
						is_valid[i] = 0;
					}
				}
			}
		}
		
		int smask = 0, ok = 1;
		vector<int> deg(n);
		for (int v = 0; v < n; v++) {
			if (i >> v & 1) {
				for (int to : G[v]) {
					deg[to]++;
				}
			}
		}
		for (int v = 0; v < n; v++) {
			if ((i >> v & 1) && deg[v] == 0) {
				smask |= 1 << v;
			}
		}
		ssmask[i] = smask;
//		cout << i << " " << sum[i] << '\n';
	}
	
	for (int i = 0; i < (1 << n); i++) {
		dp[0][i] = is_valid[i] && dep[i] == 0 ? 0 : INF;
//		cout << "At " << 0 << ' ' << i << ' ' << dp[0][i] << '\n';
	}
	for (int j = 1; j < n; j++) {
		for (int i = 0; i < (1 << n); i++) dp[j][i] = INF;
		vector<LL> minv(1 << n, INF), tmp(1 << n);
		for (int i = 0; i < (1 << n); i++) {
			if (dp[j - 1][i] != INF) {
				minv[i] = dp[j - 1][i] - (LL) j * sum[i];
			}
//			cout << "MIN " << i << ' ' << minv[i] << '\n';
			tmp[i] = i;
		}
		for (int b = 0; b < n; b++) {
			for (int i = 0; i < (1 << n); i++) {
				if ((~i >> b & 1) && minv[i] > minv[i ^ 1 << b]) {
					minv[i] = minv[i ^ 1 << b];
					tmp[i] = tmp[i ^ 1 << b];
				}
			}
		}
//		for (int i = 0; i < (1 << n); i++) {
//			cout << "TMP " << i << ' ' << tmp[i] << '\n';
//		}
		
		for (int i = 0; i < (1 << n); i++) {
			if (!is_valid[i]) {
				continue;
			}
			
			int smask = ssmask[i];
			if (minv[i ^ smask] != INF) {
				dp[j][i] = minv[i ^ smask] + (LL)j * sum[i];
				from[j][i] = tmp[i ^ smask];
			}
//			cout << "At " << j << ' ' << i << ' ' << dp[j][i] << ' ' << from[j][i] << '\n';
		}
	}
	
//	cout << dp[n - 1][(1 << n) - 1] << '\n';
	int cur = (1 << n) - 1;
	for (int i = n - 1; i >= 0; i--) {
		int sub = from[i][cur];
		assert((sub | cur) == cur);
		for (int j = 0; j < n; j++) {
			if ((~sub >> j & 1) && (cur >> j & 1)) {
				ans[j] = i;
			}
		}
		cur = sub;
	}
	for (int i = 0; i < n; i++) {
		cout << ans[i] << " \n"[i == n - 1];
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);

	int tc = 1;
//	cin >> tc;
	for (int i = 1; i <= tc; i++) {
		solve();
	}

	return 0;
} 