#include<bits/stdc++.h>
#define in inline
using namespace std;
const int N=3e6+10;
int n,ans,tot=1;
int head[N],dis[N],vis[N],ch[32*N][2];
struct point{
int nxt,to,w;
}edge[N*2];
in int read()
{
int f=1,x=0;char c=getchar();
while('9'<c||c<'0'){
if(c=='-')f=-f;c=getchar();
}
while('0'<=c&&c<='9')
x=x*10+c-'0',c=getchar();
return x*f;
}
in void add(int u,int v,int w)
{
edge[++tot].nxt=head[u],edge[tot].to=v;
edge[tot].w=w,head[u]=tot;
edge[++tot].nxt=head[v],edge[tot].to=u;
edge[tot].w=w,head[v]=tot;
}
in void dfs(int x)
{
int i,to;
for(i=head[x];i;i=edge[i].nxt){
to=edge[i].to;
if(vis[to])continue;
vis[to]=1,dis[to]=dis[x]^edge[i].w;
dfs(to);
}
}
in void insert(int x)
{
int p=1,i,str;
for(i=31;i;i--){
str=(x>>i)&1;
if(!ch[p][str])ch[p][str]=++tot;
p=ch[p][str];
}
}
in int query(int x)
{
int lans=0,p=1,i,str;
for(i=31;i;i--){
str=((x>>i)&1)==1?0:1;
if(ch[p][str])lans+=(1<<i);
else str=(x>>i)&1;
p=ch[p][str];
}
return lans;
}
int main()
{
int u,v,w,i;n=read();
for(i=1;i<n;++i){
u=read()+1,v=read()+1,w=read();
add(u,v,w);
}
vis[1]=1;dfs(1);
for(i=1;i<=n;++i)insert(dis[i]);
for(i=1;i<=n;++i)
ans=max(ans,query(dis[i]));
cout<<ans;
}