#include #include #include #include using namespace std; const int N = 500000; const int M = 500000; const int K = 16; int n, m, base; int p[N], s[N], w[N]; long long w2[N]; int e1[M][4], e2[M][3]; bitset ans; int getp(int x) { if (p[x] != x) { getp(p[x]); w[x] += w[p[x]]; w[x] &= base; p[x] = p[p[x]]; } return p[x]; } int uni(int a, int b, int c) { getp(a); getp(b); c += w[b] + base + 1 - w[a]; c &= base; a = p[a]; b = p[b]; if (a == b) return c; if (s[a] > s[b]) { swap(a, b); c = (base + 1 - c) & base; } p[a] = b; w[a] = c; s[b] += s[a]; return 0; } int getp2(int x) { if (p[x] != x) { getp2(p[x]); w2[x] += w2[p[x]]; p[x] = p[p[x]]; } return p[x]; } int uni2(int a, int b, long long c) { getp2(a); getp2(b); c += w2[b] - w2[a]; a = p[a]; b = p[b]; if (a == b) return (c != 0ll); if (s[a] > s[b]) { swap(a, b); c = -c; } p[a] = b; w2[a] = c; s[b] += s[a]; return 0; } int _p; char b[32010]; void inc() { _p++; if (_p == 32000) { _p = 0; fread(b, 1, 32000, stdin); } } void Int(int& x) { while (!isdigit(b[_p])) { if (b[_p] == '-') { inc(); inc(); x = -1; return; } inc(); } x = 0; while (isdigit(b[_p])) { x = 10 * x + b[_p] - '0'; inc(); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int a, b, c, d; Int(n); Int(m); ans = 0; for (int i = 0; i < m; i++) { Int(a); Int(b); Int(c); Int(d); e1[i][0] = a - 1; e1[i][1] = b - 1; e1[i][2] = c; e1[i][3] = (d == -1) ? (1 << 18) : d; if (d == -1) { e2[i][0] = a - 1; e2[i][1] = b - 1; e2[i][2] = c; } else e2[i][0] = -1; } for (int j = 1; j <= K; j++) { for (int i = 0; i < n; i++) { s[i] = 1; p[i] = i; w[i] = 0; } base |= (1 << (j - 1)); for (int i = 0; i < m; i++) { if (ans[i] || e1[i][3] == 1) continue; if (uni(e1[i][0], e1[i][1], e1[i][2] & base)) ans[i] = 1; e1[i][3] >>= 1; } } /* Doing -1 specially because we are bold */ for (int i = 0; i < n; i++) { s[i] = 1; p[i] = i; w2[i] = 0; } for (int i = 0; i < m; i++) { if (ans[i] || e2[i][0] == -1) continue; if (uni2(e2[i][0], e2[i][1], e2[i][2])) ans[i] = 1; } for (int i = 0; i < m; i++) { if (ans[i]) cout << "0\n"; else cout << "1\n"; } }