#include <bits/stdc++.h>
using ll = long long;
using namespace std;
int n,m;
int tire[1000010][2];
int ind = 0;
int cnt[1000000];
void add(int x){
int p = 0;
for(int i=30;i>=0;i--){
int k = x>>i & 1;
if(!tire[p][k]) tire[p][k] = ++ ind;
p = tire[p][k];
}
cnt[p]++;
}
int query(int x){
int res = 0;
int p = 0;
for(int i=30;i>=0;i--){
int k = x>>i & 1;
if(tire[p][!k]){
p = tire[p][!k];
res = res * 2 + 1;
}else{
p = tire[p][k];
res = res * 2;
}
}
return res;
}
vector<int> gar[100010];
vector<int> val[100010];
bool has_father[100010];
vector<int> dis;
void bfs(int root){
queue<pair<int,int>> q;
q.push({root,0});
while(q.size()){
auto u = q.front();
int from = u.first;
int v = u.second;
add(v);
dis.push_back(v);
q.pop();
for(int i=0;i<gar[from].size();i++){
int to = gar[from][i];
int w = val[from][i];
q.push({to,v ^ w});
/* add(v);
ct.push_back(v);*/
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n-1;i++){
int u,v,w;
cin>>u>>v>>w;
gar[u].push_back(v);
val[u].push_back(w);
has_father[v] = true;
}
for(int i=1;i<=n;i++){
if(!has_father[i]){
bfs(i);
break;
}
}
int res = 0 ;
//cout<<ct.size();
for(auto x :dis){
//cout<<x<<" ";
res = max(res, query(x));
}
cout<<res;
}
从根节点开始,跑一下每个节点的异或值,因为异或有抵消的性质,所以从x 到 y的异或值,就是dis[x] ^ dis[y]
再跑一下最大异或对就行了