#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int N=3e5+10;
int val[N],ver[N],Next[N],head[N],edge[N],tot;
void add(int x,int y,int z){
ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot;
}
struct Trie{
int T[N*10][2],tot;
void init(){
tot=1;
memset(T,0,sizeof T);
insert(0);
}
void insert(int x){
int p=1;
for(int i=1<<30;i;i>>=1){
int y=(x&i)?1:0;
if(!T[p][y]) T[p][y]=++tot;
p=T[p][y];
}
}
int find(int x){
int p=1,ans=0;
for(int i=1<<30;i;i>>=1){
int y=(x&i)?0:1;
if(T[p][y])ans+=i,p=T[p][y];
else p=T[p][!y];
}
return ans;
}
}T;
void dfs(int x,int y){
for(int i=head[x];i;i=Next[i]){
if(ver[i]==y)continue;
val[ver[i]]=val[x]^edge[i];
dfs(ver[i],x);
}
}
int main(){
int n;
while(cin>>n){
for(int i=0;i<N;++i)
val[i]=ver[i]=Next[i]=head[i]=edge[i]=tot=0;
for(int i=1,x,y,z;i<n;i++)scanf("%d%d%d",&x,&y,&z),++x,++y,add(x,y,z),add(y,x,z);
T.init();
dfs(1,0);
int ans=0;
for(int i=1;i<=n;i++)T.insert(val[i]);
for(int i=1;i<=n;i++)ans=max(T.find(val[i]),ans);
printf("%d\n",ans);
}
}