#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll maxn = 1e5 + 5;
const ll maxm = 1e3 + 5;
namespace IO{
    const int SIZE = (1 << 20) + 1;
    char ibuf[SIZE], *iS, *iT, obuf[SIZE],*oS = obuf, *oT = obuf + SIZE - 1;
    char _st[55];
    int _qr = 0;
    inline char gc(){
        return (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS++) : *iS++);
    }
    inline void qread(){}
    template<class T1, class ...T2>
    inline void qread(T1 &IEE, T2&... ls){
        register T1 __ = 0, ___ = 1;
        register char ch;
        while(!isdigit(ch = gc())) ___ = (ch == '-') ? -___ : ___;
        do{
            __ = (__ << 1) + (__ << 3) + (ch ^ 48);
        }while(isdigit(ch = gc()));
        __ *= ___;
        IEE = __;
        qread(ls...);
        return ;
    }
    inline void flush(){
        fwrite(obuf, 1, oS - obuf, stdout);
        oS = obuf;
        return ;
    }
    inline void putc_(char _x){
        *oS++ = _x;
        if(oS == oT) flush();
    }
    inline void qwrite(){}
    template<class T1, class ...T2>
    inline void qwrite(T1 IEE, T2... ls){
        if(!IEE) putc_('0');
        if(IEE < 0) putc_('-'), IEE = -IEE;
        while(IEE) _st[++_qr] = IEE % 10 + '0', IEE /= 10;
        while(_qr) putc_(_st[_qr--]);
        qwrite(ls...);
        return ;
    }
    struct Flusher_{~Flusher_(){flush();}}io_flusher;
}
using namespace IO;
ll n, u_, v_, w_;
ll v[maxn], dp[1 << 16];
ll cnt[maxn];
ll ans;
int main(){
    cin.tie(0);
    cin >> n;
    for(int i = 1;i < n;i++){
        cin >> u_ >> v_ >> w_;
        v[u_] ^= w_;
        v[v_] ^= w_;
    }
    for(int i = 0;i < n;i++){
        cnt[v[i]]++;
    }
    ll init = 0;
    for(int i = 1;i <= 15;i++){
        ans += cnt[i] / 2;
        // cout << cnt[i] << endl;
        if(cnt[i] & 1){
            init |= (1 << (i - 1));
        }
    }
    memset(dp, 0x3f, sizeof(dp));
    dp[init] = 0;
    for(int i = 15;i > 0;i--){
        for(int S = 0;S < (1 << 15);S++){
            ll cnt = 0;
            for(int k = 0;k < 15;k++){
                if((S >> k) & 1) cnt++;
            }
            if(cnt != i) continue;
            // cout << cnt << " " << S << endl;
            for(int k = 0;k < 15;k++){
                if(!((S >> k) & 1)) continue;
                for(int w = 0;w < 15;w++){
                    if(k == w){
                        dp[S ^ (1 << k)] = min(dp[S ^ (1 << k)], dp[S] + 1);
                        continue;
                    }
                    if(!((S >> w) & 1)) continue;
                    ll newnum = ((k + 1) ^ (w + 1)) - 1;
                    if(((S >> newnum) & 1) == 1){
                        dp[(S ^ (1 << k) ^ (1 << w)) ^ (1 << newnum)] = 
                        min(dp[S ^ (1 << k) ^ (1 << w) ^ (1 << newnum)], dp[S] + 2);
                    } else {
                        dp[(S ^ (1 << k) ^ (1 << w)) | (1 << newnum)] = 
                        min(dp[(S ^ (1 << k) ^ (1 << w)) | (1 << newnum)], dp[S] + 1);
                    }
                }
            }
        }
    }
    ans += dp[0];
    cout << ans << endl;
    return 0;
}


Measured memory_bytes: 4896