#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
if (!(cin >> N)) return 0;
vector<vector<pair<int,int>>> g(N+1);
g.reserve(N+1);
for (int i = 0; i < N-1; ++i) {
int u, v; int w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
// 1) px 계산 (루트 = 1), 비재귀
vector<uint32_t> px(N+1, 0);
vector<char> vis(N+1, 0);
px[1] = 0; vis[1] = 1;
vector<int> st; st.reserve(N);
st.push_back(1);
while (!st.empty()) {
int u = st.back(); st.pop_back();
for (auto [v, w] : g[u]) {
if (!vis[v]) {
vis[v] = 1;
px[v] = px[u] ^ (uint32_t)w;
st.push_back(v);
}
}
}
// 2) px 값들을 모아 정렬 후 같은 값 묶음별로 쌍 수 합산
vector<uint32_t> vals; vals.reserve(N);
for (int i = 1; i <= N; ++i) vals.push_back(px[i]);
sort(vals.begin(), vals.end());
long long ans = 0; // 최대 ~1.25e11 이므로 64비트
long long cnt = 1;
for (int i = 1; i < N; ++i) {
if (vals[i] == vals[i-1]) ++cnt;
else {
ans += cnt * (cnt - 1) / 2;
cnt = 1;
}
}
ans += cnt * (cnt - 1) / 2;
cout << ans << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IE47CiAgICBpZiAoIShjaW4gPj4gTikpIHJldHVybiAwOwoKICAgIHZlY3Rvcjx2ZWN0b3I8cGFpcjxpbnQsaW50Pj4+IGcoTisxKTsKICAgIGcucmVzZXJ2ZShOKzEpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOLTE7ICsraSkgewogICAgICAgIGludCB1LCB2OyBpbnQgdzsKICAgICAgICBjaW4gPj4gdSA+PiB2ID4+IHc7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2soe3YsIHd9KTsKICAgICAgICBnW3ZdLnB1c2hfYmFjayh7dSwgd30pOwogICAgfQoKICAgIC8vIDEpIHB4IOqzhOyCsCAo66Oo7Yq4ID0gMSksIOu5hOyerOq3gAogICAgdmVjdG9yPHVpbnQzMl90PiBweChOKzEsIDApOwogICAgdmVjdG9yPGNoYXI+IHZpcyhOKzEsIDApOwogICAgcHhbMV0gPSAwOyB2aXNbMV0gPSAxOwogICAgdmVjdG9yPGludD4gc3Q7IHN0LnJlc2VydmUoTik7CiAgICBzdC5wdXNoX2JhY2soMSk7CiAgICB3aGlsZSAoIXN0LmVtcHR5KCkpIHsKICAgICAgICBpbnQgdSA9IHN0LmJhY2soKTsgc3QucG9wX2JhY2soKTsKICAgICAgICBmb3IgKGF1dG8gW3YsIHddIDogZ1t1XSkgewogICAgICAgICAgICBpZiAoIXZpc1t2XSkgewogICAgICAgICAgICAgICAgdmlzW3ZdID0gMTsKICAgICAgICAgICAgICAgIHB4W3ZdID0gcHhbdV0gXiAodWludDMyX3QpdzsKICAgICAgICAgICAgICAgIHN0LnB1c2hfYmFjayh2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyAyKSBweCDqsJLrk6TsnYQg66qo7JWEIOygleugrCDtm4Qg6rCZ7J2AIOqwkiDrrLbsnYzrs4TroZwg7IyNIOyImCDtlansgrAKICAgIHZlY3Rvcjx1aW50MzJfdD4gdmFsczsgdmFscy5yZXNlcnZlKE4pOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgKytpKSB2YWxzLnB1c2hfYmFjayhweFtpXSk7CiAgICBzb3J0KHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSk7CgogICAgbG9uZyBsb25nIGFucyA9IDA7IC8vIOy1nOuMgCB+MS4yNWUxMSDsnbTrr4DroZwgNjTruYTtirgKICAgIGxvbmcgbG9uZyBjbnQgPSAxOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOOyArK2kpIHsKICAgICAgICBpZiAodmFsc1tpXSA9PSB2YWxzW2ktMV0pICsrY250OwogICAgICAgIGVsc2UgewogICAgICAgICAgICBhbnMgKz0gY250ICogKGNudCAtIDEpIC8gMjsKICAgICAgICAgICAgY250ID0gMTsKICAgICAgICB9CiAgICB9CiAgICBhbnMgKz0gY250ICogKGNudCAtIDEpIC8gMjsKCiAgICBjb3V0IDw8IGFucyA8PCAnXG4nOwogICAgcmV0dXJuIDA7Cn0=