/*
数据不清空，爆零两行泪。
多测不读完，爆零两行泪。
边界不特判，爆零两行泪。
贪心不证明，爆零两行泪。
D P 顺序错，爆零两行泪。
大小少等号，爆零两行泪。
变量不统一，爆零两行泪。
越界不判断，爆零两行泪。
调试不注释，爆零两行泪。
溢出不 l l，爆零两行泪。
*/
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define X first
#define Y second
#define pb push_back
const int inf=0x3f3f3f3f;
int lowbit(int x){return x&-x;}
int ppc(int x){return __builtin_popcount(x);}
const int N=100000;
int n;
vector<pair<int,int> > nei[N+1];
int buc[16];
int dfs(int x=1,int fa=0){
	int xsm=0;
	for(int i=0;i<nei[x].size();i++){
		int y=nei[x][i].X,v=nei[x][i].Y;
		if(y==fa)continue;
		xsm^=v;
		buc[dfs(y,x)^v]++;
	}
	return xsm;
}
int dp[1<<15];
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y,z;
		cin>>x>>y>>z;
		x++;y++;
		nei[x].pb(mp(y,z));nei[y].pb(mp(x,z));
	}
	dfs();
	for(int i=1;i<1<<15;i++){
		dp[i]=ppc(i);
		int xsm=0;
		for(int j=1;j<=15;j++)if(i&1<<j-1)xsm^=j;
		if(!xsm)dp[i]=ppc(i)-1;
		for(int j=i-1&i;j;j=j-1&i)dp[i]=min(dp[i],dp[j]+dp[i^j]);
	}
	int ans=0,msk=0;
	for(int i=1;i<=15;i++)ans+=buc[i]>>1,msk|=(buc[i]&1)<<i-1;
	cout<<ans+dp[msk];
	return 0;
}