bool 开了
双倍空间开了
#10 数据下载了,n 是 1e5
#include <bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
const int N = 2e5 + 5;
int hd[N], cnt;
int son[N][2], tot;
int num[N];
struct Edge {
int to, nx, w;
} e[N << 1];
void add(int u, int v, int w) {
e[ ++ cnt] = {v, hd[u], w}, hd[u] = cnt;
}
void ins(int num) {
int p = 0;
for (int i = 31; i >= 0; i --) {
int x = (1 << i);
bool id = num & x;
if (!son[p][id]) son[p][id] = ++ tot;
p = son[p][id];
}
}
int query(int num) {
int p = 0, res = 0;
for (int i = 31; i >= 0; i --) {
int x = (1 << i);
bool id = num & x;
if (son[p][!id]) p = son[p][!id], res += x;
else p = son[p][id];
}
return res;
}
void dfs(int u, int fa, int x) {
num[u] = x;
for (int i = hd[u]; i; i = e[i].nx) {
int v = e[i].to, w = e[i].w;
if (v == fa) continue;
dfs(v, u, x ^ w);
}
}
signed main() {
// freopen("P4551_10.in", "r", stdin);
// freopen("test.out", "w", stdout);
int n;
cin >> n;
for (int i = 1; i < n; i ++) {
int u, v, w;
cin >> u >> v >> w;
add(u, v, w), add(v, u, w);
}
dfs(1, 0, 0);
for (int i = 1; i <= n; i ++) ins(num[i]);
int ans = 0;
for (int i = 1; i <= n; i ++) ans = max(ans, query(num[i]));
cout << ans;
return 0;
}