constint Maxn = 100000 + 5; int Tree[Maxn * 31][2], Id; int Xor[Maxn]; int N, U, V, C, Ans; int Head[Maxn], Next[Maxn << 1], Edge[Maxn << 1], W[Maxn << 1], Cur;
inlinevoidAddEdge(int U, int V, int C) { Next[++Cur] = Head[U]; Head[U] = Cur; Edge[Cur] = V; W[Cur] = C; }
inlinevoidInsert(int X, int Rt = 0) { for (int i = 1 << 30; i; i >>= 1) { bool F = X & i; if (!Tree[Rt][F]) Tree[Rt][F] = ++Id; Rt = Tree[Rt][F]; } }
inlineintQuery(int X, int Rt = 0, int Ans = 0) { for (int i = 1 << 30; i; i >>= 1) { bool F = X & i; if (Tree[Rt][!F]) Ans += i, Rt = Tree[Rt][!F]; else Rt = Tree[Rt][F]; } return Ans; }
voidDFS(int U, int F) { for (int i = Head[U]; i; i = Next[i]) { if (Edge[i] == F) continue; Xor[Edge[i]] = Xor[U] ^ W[i]; DFS(Edge[i], U); } }
inlineintmax(int a, int b){return a > b ? a : b;}
intmain() { scanf("%d", &N); for (int i = 1; i < N; ++i) { scanf("%d %d %d", &U, &V, &C); AddEdge(U, V, C), AddEdge(V, U, C); } DFS(1, 1); for (int i = 1; i <= N; ++i) Insert(Xor[i]); for (int i = 1; i <= N; ++i) Ans = max(Ans, Query(Xor[i])); printf("%d\n", Ans); }