#include <bits/stdc++.h>
using namespace std;
 
const int maxn = 1000 + 20;
const int maxm = 50000 + 20;
 
struct Arc {
	int from, to, val;
	Arc() {}
	Arc(int from, int to, int val):from(from), to(to), val(val) {}
};
vector<Arc> arc;
int n, m;
bool dead[maxn];
 
vector<int> G[maxn];
/*{ SCC*/
int pre[maxn], lowlink[maxn], sccno[maxn], vex_cnt[maxn], dfs_clock, scc_cnt;
stack<int> S;
void dfs(int u) {
	pre[u] = lowlink[u] = ++dfs_clock;
	S.push(u);
	for(size_t i = 0; i < G[u].size(); ++i) {
		int v = G[u][i];
		if(!pre[v]) {
			dfs(v);
			lowlink[u] = min(lowlink[u], lowlink[v]);
		} else if(!sccno[v]) {
			lowlink[u] = min(lowlink[u], pre[v]);
		}
	}
	if(lowlink[u] == pre[u]) {
		scc_cnt++;
		int x;
		do {
			x = S.top(); S.pop();
			sccno[x] = scc_cnt;
			vex_cnt[scc_cnt]++;
		} while(u != x);
	}
}
void find_scc() {
	dfs_clock = scc_cnt = 0;
	memset(sccno, 0, sizeof sccno);
	memset(pre, 0, sizeof pre);
	memset(vex_cnt, 0, sizeof vex_cnt);
	for(int i = 1; i <= n; ++i) {
		if(!pre[i]) dfs(i);
	}
}
/*}*/
 
void kill(int u) {
	dead[u] = 1;
	for(size_t i = 0; i < G[u].size(); ++i) {
		if(!dead[G[u][i]]) {
			kill(G[u][i]);
		}
	}
}
 
 
 
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= m; ++i) {
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		arc.push_back(Arc(a, b, c));
		if(c == 0) {
			if(a == b) {
				dead[a] = true;
			} else {
				G[a].push_back(b);
			}
		}
	}
	find_scc();
	for(int i = 1; i <= n; ++i) {
		G[i].clear();
	}
	for(size_t i = 0; i < arc.size(); ++i) {
		G[arc[i].from].push_back(arc[i].to);
	}
	for(int i = 1; i <= n; ++i) {
		if(1 < vex_cnt[sccno[i]] || dead[i]) {
			kill(i);
		}
	}
	for(int i = 1; i <= n; ++i) {
		printf("%d\n", !dead[i]);
	}
	return 0;
}
 
 
				I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbWF4biA9IDEwMDAgKyAyMDsKY29uc3QgaW50IG1heG0gPSA1MDAwMCArIDIwOwoKc3RydWN0IEFyYyB7CglpbnQgZnJvbSwgdG8sIHZhbDsKCUFyYygpIHt9CglBcmMoaW50IGZyb20sIGludCB0bywgaW50IHZhbCk6ZnJvbShmcm9tKSwgdG8odG8pLCB2YWwodmFsKSB7fQp9Owp2ZWN0b3I8QXJjPiBhcmM7CmludCBuLCBtOwpib29sIGRlYWRbbWF4bl07Cgp2ZWN0b3I8aW50PiBHW21heG5dOwovKnsgU0NDKi8KaW50IHByZVttYXhuXSwgbG93bGlua1ttYXhuXSwgc2Njbm9bbWF4bl0sIHZleF9jbnRbbWF4bl0sIGRmc19jbG9jaywgc2NjX2NudDsKc3RhY2s8aW50PiBTOwp2b2lkIGRmcyhpbnQgdSkgewoJcHJlW3VdID0gbG93bGlua1t1XSA9ICsrZGZzX2Nsb2NrOwoJUy5wdXNoKHUpOwoJZm9yKHNpemVfdCBpID0gMDsgaSA8IEdbdV0uc2l6ZSgpOyArK2kpIHsKCQlpbnQgdiA9IEdbdV1baV07CgkJaWYoIXByZVt2XSkgewoJCQlkZnModik7CgkJCWxvd2xpbmtbdV0gPSBtaW4obG93bGlua1t1XSwgbG93bGlua1t2XSk7CgkJfSBlbHNlIGlmKCFzY2Nub1t2XSkgewoJCQlsb3dsaW5rW3VdID0gbWluKGxvd2xpbmtbdV0sIHByZVt2XSk7CgkJfQoJfQoJaWYobG93bGlua1t1XSA9PSBwcmVbdV0pIHsKCQlzY2NfY250Kys7CgkJaW50IHg7CgkJZG8gewoJCQl4ID0gUy50b3AoKTsgUy5wb3AoKTsKCQkJc2Njbm9beF0gPSBzY2NfY250OwoJCQl2ZXhfY250W3NjY19jbnRdKys7CgkJfSB3aGlsZSh1ICE9IHgpOwoJfQp9CnZvaWQgZmluZF9zY2MoKSB7CglkZnNfY2xvY2sgPSBzY2NfY250ID0gMDsKCW1lbXNldChzY2NubywgMCwgc2l6ZW9mIHNjY25vKTsKCW1lbXNldChwcmUsIDAsIHNpemVvZiBwcmUpOwoJbWVtc2V0KHZleF9jbnQsIDAsIHNpemVvZiB2ZXhfY250KTsKCWZvcihpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CgkJaWYoIXByZVtpXSkgZGZzKGkpOwoJfQp9Ci8qfSovCgp2b2lkIGtpbGwoaW50IHUpIHsKCWRlYWRbdV0gPSAxOwoJZm9yKHNpemVfdCBpID0gMDsgaSA8IEdbdV0uc2l6ZSgpOyArK2kpIHsKCQlpZighZGVhZFtHW3VdW2ldXSkgewoJCQlraWxsKEdbdV1baV0pOwoJCX0KCX0KfQoKCQoKaW50IG1haW4oKSB7CglzY2FuZigiJWQlZCIsICZuLCAmbSk7Cglmb3IoaW50IGkgPSAxOyBpIDw9IG07ICsraSkgewoJCWludCBhLCBiLCBjOwoJCXNjYW5mKCIlZCVkJWQiLCAmYSwgJmIsICZjKTsKCQlhcmMucHVzaF9iYWNrKEFyYyhhLCBiLCBjKSk7CgkJaWYoYyA9PSAwKSB7CgkJCWlmKGEgPT0gYikgewoJCQkJZGVhZFthXSA9IHRydWU7CgkJCX0gZWxzZSB7CgkJCQlHW2FdLnB1c2hfYmFjayhiKTsKCQkJfQoJCX0KCX0KCWZpbmRfc2NjKCk7Cglmb3IoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewoJCUdbaV0uY2xlYXIoKTsKCX0KCWZvcihzaXplX3QgaSA9IDA7IGkgPCBhcmMuc2l6ZSgpOyArK2kpIHsKCQlHW2FyY1tpXS5mcm9tXS5wdXNoX2JhY2soYXJjW2ldLnRvKTsKCX0KCWZvcihpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CgkJaWYoMSA8IHZleF9jbnRbc2Njbm9baV1dIHx8IGRlYWRbaV0pIHsKCQkJa2lsbChpKTsKCQl9Cgl9Cglmb3IoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewoJCXByaW50ZigiJWRcbiIsICFkZWFkW2ldKTsKCX0KCXJldHVybiAwOwp9CgkK