#include <stdio.h>
#include <memory>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
const int N = 100000;
const int D = 2;
const int S = 31;
struct node{
//bool flag;
node* next[D];
}*head;
node num[N*20];
struct e{
int v, nxt, w;
}es[N*2];
int bits[S];
int fir[N], val[N];
int n, en, top;
char str[S*2];
void pre(){
bits[0] = 1;
int i;
for(i = 1; i < S; i++) bits[i] = bits[i-1] << 1;
}
void new_node(node* & p){
p = &num[top++];
//p->flag = true;
int i;
for(i = 0; i < D; i++) p->next[i] = NULL;
}
void add_e(int u, int v, int w){
es[en].v = v, es[en].nxt = fir[u], es[en].w = w, fir[u] = en++;
}
bool input(){
if(scanf("%d", &n) == EOF) return false;
int i;
en = top = 0;
int u, v, w;
for(i = 0; i < n; i++) fir[i] = -1;
for(i = 1; i < n; i++){
scanf("%d%d%d", &u, &v, &w);
add_e(u, v, w);
add_e(v, u, w);
}
return true;
}
void dfs(int id, int w, int f){
val[id] = w;
int v, cur;
for(cur = fir[id]; cur != -1; cur = es[cur].nxt){
if((v = es[cur].v) != f){
dfs(v, w ^ es[cur].w, id);
}
}
}
void insert(char* str){
node* p = head;
int i, j, k;
for(i = 0; str[i]; i++){
k = str[i] - '0';
if(!p->next[k]) new_node(p->next[k]);
p = p->next[k];
}
}
int findMax(int v){ //找以v为一个端点的最长异或路径
node* p ;
int i, j, k;
p = head;
int ans = 0;
for(j = S - 1; j >= 0; j--){
k = v & bits[j];
if(k) k = 1;
if(p->next[k ^ 1]){
p = p->next[k ^ 1];
ans += bits[j];
}else{
p = p->next[k];
}
}
return ans;
}
void solve(){
dfs(0, 0, -1);
int i, ans = 0, j, k;
new_node(head);
for(i = 0; i < n; i++){
k = val[i];
for(j = S - 1; j >= 0; j--) str[j] = (k & 1) + '0', k >>= 1;
str[S] = '\0';
insert(str);
}
for(i = 0; i < n; i++){
ans = max(ans, findMax(val[i]));
}
printf("%d\n", ans);
}