#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
using namespace std;
#define pi acos(-1.0)
#define maxd 1000000007
typedef long long ll;
int n,dp[1001000],xo[1001000],cnt[1001000],ans=0,w[1001000];

int read()
{
	int x=0,f=1;char ch=getchar();
	while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
	while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
	return x*f;
}

int main()
{
	n=read();memset(w,0,sizeof(w));int i,j;
	for (i=1;i<n;i++) 
	{
		int u=read(),v=read(),w1=read();
		w[u]^=w1;w[v]^=w1;
	}
	for (i=0;i<n;i++) cnt[w[i]]++;
	int ans=0,now=0;
	for (i=1;i<=15;i++)
	{
		ans+=cnt[i]/2;now|=(cnt[i]&1)<<(i-1);
	}
	int all=(1<<15)-1;
	for (i=1;i<=all;i++) dp[i]=dp[i>>1]+(i&1);
	for (i=1;i<=all;i++) dp[i]--;
	for (i=0;i<=all;i++)
	{
		xo[i]=0;
		for (j=1;j<=15;j++)
		{
			if ((i>>(j-1))&1) xo[i]^=j;
		}
	}
	for (i=1;i<=all;i++)
	{
	    if (xo[i]) continue;
		for (j=i;j;j=(j-1)&i)
		{
		    if (!xo[j]) dp[i]=min(dp[i],dp[j]+dp[j^i]);
		}
	}
	ans+=dp[now];
	printf("%d",ans);
	return 0;
}

