#include <bits/stdc++.h>
const int N = 100010;
int n, val[N], res, cnt[20], Get, dp[1 << 17], st[20];
bool check(int s)
{
	int cnt = 0;
	while(s)
	{
		int t = s & 1;
		s >>= 1;
		if(st[cnt] == 0 && t) return false;
		cnt ++;
	}
	return true;
}
int Solve(int s)
{
	if(s == 0) return 0;
	if(dp[s] != 0x3f3f3f3f) return dp[s];
	for(int i=1;i<=15;i++)
	{
		for(int j=i+1;j<=15;j++)
		{
			if((s >> i & 1) && (s >> j & 1))
			{
				int t = i ^ j;
				int p = s ^ (1 << i) ^ (1 << j) ^ (1 << t);
				if(s >> t & 1) dp[s] = std:: min(dp[s], Solve(p) + 2);
				else dp[s] = std:: min(dp[s], Solve(p) + 1);
			}
		}
	}
	return dp[s];
}
int main() 
{
	scanf("%d", &n);
	for(int i=1;i<n;i++)
	{
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		val[u] ^= w; val[v] ^= w; 
	}
	for(int i=0;i<n;i++) cnt[val[i]] ++;
	for(int i=1;i<=15;i++) 
	{
		res += cnt[i] / 2;
		if(cnt[i] & 1) Get |= (1 << i), st[i] = 1;
	}
	memset(dp, 0x3f3f3f3f, sizeof(dp));
	printf("%d\n", res + Solve(Get));
	return 0;
}