//#pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #include #include #include #include #include #include #define SZ(x) ((int)(x).size()) #define ALL(v) (v).begin(), (v).end() #define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i) #define reveach(i, v) for (__typeof((v).rbegin()) i = (v).rbegin(); i != (v).rend(); ++ i) #define REP(i,n) for ( int i=1; i<=int(n); i++ ) #define rep(i,n) for ( int i=0; i< int(n); i++ ) using namespace std; typedef long long ll; #define X first #define Y second #define PB push_back #define MP make_pair typedef long double ld; typedef pair pii; template inline bool RD(T &ret) { char c; int sgn; if (c = getchar(), c == EOF) return 0; while (c != '-' && (c<'0' || c>'9')) c = getchar(); sgn = (c == '-') ? -1 : 1 , ret = (c == '-') ? 0 : (c - '0'); while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return 1; } template inline void PT(T x) { if (x < 0) putchar('-') ,x = -x; if (x > 9) PT(x / 10); putchar(x % 10 + '0'); } const int N = 1e5 + 10; int fa[N]; int sz[N]; int getf(int x) { return x == fa[x] ? x : fa[x] = getf(fa[x]); } void Merge(int x, int y) { int f1 = getf(x), f2 = getf(y); if(f1 == f2) return ; fa[f1] = f2; sz[f2] += sz[f1]; } int main() { int T; RD(T); while(T --) { int n; RD(n); REP(i, n) fa[i] = i, sz[i] = 1; REP(i, n - 1) { int u, v, w; RD(u), RD(v), RD(w); if( w == 0 ) Merge(u, v); } int ans = 0; REP(i, n) { int f = getf(i); ans ^= sz[f]; } printf("%d\n", ans); } }