#include<iostream>
#include<cstdio>
#include<cstring>
#define N 100100
using namespace std;

int n,num[N],ans,cnt[16],tmp,dp[400000],tm[16];
bool hav[16];

int dfs(int zt)
{
	if(dp[zt]!=-1) return dp[zt];
	int i,j,k,tt=0,res=30;
	memset(hav,0,sizeof(hav));
	for(i=1;i<=15;i++)
	{
		if((1 << (i-1))&zt) tm[++tt]=i,hav[i]=1;
	}
	for(i=1;i<=tt;i++)
	{
		for(j=1;j<=tt;j++)
		{
			if(i==j) continue;
			k=tm[j]^tm[i];
			if(hav[k])
			{
				res=min(res,dfs(zt^(1 << (tm[j]-1))^(1 << (tm[i]-1))^(1 << (k-1)))+2);
			}
			else
			{
				res=min(res,dfs(zt^(1 << (tm[i]-1))^(1 << (tm[j]-1))^(1 << (k-1)))+1);
			}
		}
	}
	return dp[zt]=res;
}

int main()
{
	int i,j,p,q,o;
	cin>>n;
	for(i=1;i<n;i++)
	{
		scanf("%d%d%d",&p,&q,&o);
		num[++p]^=o;
		num[++q]^=o;
	}
	for(i=1;i<=n;i++)
	{
//		cout<<num[i]<<" ";
		cnt[num[i]]++;
	}
	for(i=1;i<=15;i++)
	{
		ans+=cnt[i]/2;
		cnt[i]%=2;
		tmp|=cnt[i]*(1 << (i-1));
	}
	memset(dp,-1,sizeof(dp));
	dp[0]=0;
	cout<<dfs(tmp)+ans;
}