#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
#define ll long long
#define sti string
#define itachi ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define maxn 500005
#define fi first
#define se second
#define ldb long double
using namespace std;
int n;
int32_t color[maxn], sz[maxn];
bool banned[maxn];
int32_t cnt[maxn];
int32_t delta_only[maxn], delta_all[maxn];
int32_t delta_only_inside[maxn], delta_all_inside[maxn];
vector<pair<int32_t, int32_t>> adj[maxn];
long long ans=0;
int sum_only = 0;
int sum_only_inside = 0;
vector<int32_t> usedDelta, usedInside;
int current_root = 0;
void orient_color(int u, int p) {
for (auto [v, w] : adj[u]) {
if (v == p || banned[v]) continue;
color[v] = w;
orient_color(v, u);
}
}
void get_sz(int u, int p) {
sz[u] = 1;
for (auto [v, w] : adj[u]) {
if (v != p && !banned[v]) {
get_sz(v, u);
sz[u] += sz[v];
}
}
}
void countChild(int u, int p) {
sz[u] = 1;
bool first = false;
if (u != current_root) first = (++cnt[color[u]] == 1);
for (auto [v,w] : adj[u]) {
if (v == p || banned[v]) continue;
countChild(v, u);
sz[u] += sz[v];
}
if (u != current_root) {
if (first) {
sum_only += sz[u];
if (delta_all[color[u]] == 0) usedDelta.push_back(color[u]);
delta_all[color[u]] += sz[u];
delta_only[color[u]] += sz[u];
}
else if (cnt[color[u]] == 2) {
sum_only -= sz[u];
delta_only[color[u]] -= sz[u];
}
--cnt[color[u]];
}
}
int find_cen(int u, int p, int S) {
for (auto [v,w] : adj[u]) {
if (v != p && !banned[v] && sz[v] > S / 2) {
return find_cen(v, u, S);
}
}
return u;
}
void cntInside(int u, int p) {
bool first = (++cnt[color[u]] == 1);
if (first) {
sum_only_inside += sz[u];
if (delta_all_inside[color[u]] == 0) usedInside.push_back(color[u]);
delta_only_inside[color[u]] += sz[u];
delta_all_inside[color[u]] += sz[u];
}
else if (cnt[color[u]] == 2) {
sum_only_inside -= sz[u];
delta_only_inside[color[u]] -= sz[u];
}
for (auto [v,w] : adj[u]) {
if (v == p || banned[v]) continue;
cntInside(v, u);
}
--cnt[color[u]];
}
void addRootPaths(int u, int p, int distinct) {
bool first = (++cnt[color[u]] == 1);
if (first) distinct++;
else if (cnt[color[u]] == 2) distinct--;
ans += 2 * distinct;
for (auto [v, w] : adj[u]) {
if (v == p || banned[v]) continue;
addRootPaths(v, u, distinct);
}
--cnt[color[u]];
}
void dfs(int u, int p, int edge_color, int only_cur, int all_cur, int only_out, int distinctlen, int ver_out) {
int C = edge_color;
bool first = (++cnt[C] == 1);
if (first) {
distinctlen++;
all_cur += delta_all[C] - delta_all_inside[C];
only_cur += delta_only[C] - delta_only_inside[C];
}
else if (cnt[C] == 2) {
distinctlen--;
all_cur -= delta_all[C] - delta_all_inside[C];
}
ans += distinctlen * ver_out - all_cur - only_cur + only_out;
for (auto [v,w] : adj[u]) {
if (v == p || banned[v]) continue;
dfs(v, u, w, only_cur, all_cur, only_out, distinctlen, ver_out);
}
--cnt[C];
}
void solve(int u) {
get_sz(u, 0);
int root = find_cen(u, 0, sz[u]);
orient_color(root, 0);
current_root = root;
sum_only = 0;
countChild(root, 0);
int all_node = sz[root];
for (auto [v,w] : adj[root]) {
if (banned[v]) continue;
addRootPaths(v, root, 0);
}
for (auto [v,w] : adj[root]) {
if (banned[v]) continue;
sum_only_inside = 0;
cntInside(v, root);
int ver_out = all_node - sz[v] - 1;
int only_out = sum_only - sum_only_inside;
dfs(v, root, w, 0, 0, only_out, 0, ver_out);
for (int c : usedInside) {
delta_all_inside[c] = 0;
delta_only_inside[c]=0;
}
usedInside.clear();
}
banned[root] = 1;
for (int c : usedDelta) {
delta_all[c] = 0;
delta_only[c]=0;
}
usedDelta.clear();
for (auto [v,w] : adj[root]) {
if (!banned[v]) solve(v);
}
}
signed main()
{
itachi
cin>>n;
for (int i = 1; i < n; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v,w});
adj[v].push_back({u,w});
}
solve(1);
cout << ans / 2;
return 0;
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zLHVucm9sbC1sb29wcyIpCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIHN0aSBzdHJpbmcKI2RlZmluZSBpdGFjaGkgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApOwojZGVmaW5lIG1heG4gNTAwMDA1CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBsZGIgbG9uZyBkb3VibGUKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBuOwoKaW50MzJfdCBjb2xvclttYXhuXSwgc3pbbWF4bl07CmJvb2wgYmFubmVkW21heG5dOwppbnQzMl90IGNudFttYXhuXTsKaW50MzJfdCBkZWx0YV9vbmx5W21heG5dLCBkZWx0YV9hbGxbbWF4bl07CmludDMyX3QgZGVsdGFfb25seV9pbnNpZGVbbWF4bl0sIGRlbHRhX2FsbF9pbnNpZGVbbWF4bl07CnZlY3RvcjxwYWlyPGludDMyX3QsIGludDMyX3Q+PiBhZGpbbWF4bl07Cgpsb25nIGxvbmcgYW5zPTA7CmludCBzdW1fb25seSA9IDA7CmludCBzdW1fb25seV9pbnNpZGUgPSAwOwp2ZWN0b3I8aW50MzJfdD4gdXNlZERlbHRhLCB1c2VkSW5zaWRlOwppbnQgY3VycmVudF9yb290ID0gMDsKCnZvaWQgb3JpZW50X2NvbG9yKGludCB1LCBpbnQgcCkgewogICAgZm9yIChhdXRvIFt2LCB3XSA6IGFkalt1XSkgewogICAgICAgIGlmICh2ID09IHAgfHwgYmFubmVkW3ZdKSBjb250aW51ZTsKICAgICAgICBjb2xvclt2XSA9IHc7CiAgICAgICAgb3JpZW50X2NvbG9yKHYsIHUpOwogICAgfQp9Cgp2b2lkIGdldF9zeihpbnQgdSwgaW50IHApIHsKICAgIHN6W3VdID0gMTsKICAgIGZvciAoYXV0byBbdiwgd10gOiBhZGpbdV0pIHsKICAgICAgICBpZiAodiAhPSBwICYmICFiYW5uZWRbdl0pIHsKICAgICAgICAgICAgZ2V0X3N6KHYsIHUpOwogICAgICAgICAgICBzelt1XSArPSBzelt2XTsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgY291bnRDaGlsZChpbnQgdSwgaW50IHApIHsKICAgIHN6W3VdID0gMTsKICAgIGJvb2wgZmlyc3QgPSBmYWxzZTsKICAgIGlmICh1ICE9IGN1cnJlbnRfcm9vdCkgZmlyc3QgPSAoKytjbnRbY29sb3JbdV1dID09IDEpOwogICAgZm9yIChhdXRvIFt2LHddIDogYWRqW3VdKSB7CiAgICAgICAgaWYgKHYgPT0gcCB8fCBiYW5uZWRbdl0pIGNvbnRpbnVlOwogICAgICAgIGNvdW50Q2hpbGQodiwgdSk7CiAgICAgICAgc3pbdV0gKz0gc3pbdl07CiAgICB9CiAgICBpZiAodSAhPSBjdXJyZW50X3Jvb3QpIHsKICAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgICAgc3VtX29ubHkgKz0gc3pbdV07CiAgICAgICAgICAgIGlmIChkZWx0YV9hbGxbY29sb3JbdV1dID09IDApIHVzZWREZWx0YS5wdXNoX2JhY2soY29sb3JbdV0pOwogICAgICAgICAgICBkZWx0YV9hbGxbY29sb3JbdV1dICs9IHN6W3VdOwogICAgICAgICAgICBkZWx0YV9vbmx5W2NvbG9yW3VdXSArPSBzelt1XTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY250W2NvbG9yW3VdXSA9PSAyKSB7IAogICAgICAgICAgICBzdW1fb25seSAtPSBzelt1XTsKICAgICAgICAgICAgZGVsdGFfb25seVtjb2xvclt1XV0gLT0gc3pbdV07CiAgICAgICAgfQogICAgICAgIC0tY250W2NvbG9yW3VdXTsKICAgIH0KfQoKaW50IGZpbmRfY2VuKGludCB1LCBpbnQgcCwgaW50IFMpIHsKICAgIGZvciAoYXV0byBbdix3XSA6IGFkalt1XSkgewogICAgICAgIGlmICh2ICE9IHAgJiYgIWJhbm5lZFt2XSAmJiBzelt2XSA+IFMgLyAyKSB7CiAgICAgICAgICAgIHJldHVybiBmaW5kX2Nlbih2LCB1LCBTKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdTsKfQoKdm9pZCBjbnRJbnNpZGUoaW50IHUsIGludCBwKSB7CiAgICBib29sIGZpcnN0ID0gKCsrY250W2NvbG9yW3VdXSA9PSAxKTsKCiAgICBpZiAoZmlyc3QpIHsKICAgICAgICBzdW1fb25seV9pbnNpZGUgKz0gc3pbdV07CiAgICAgICAgaWYgKGRlbHRhX2FsbF9pbnNpZGVbY29sb3JbdV1dID09IDApIHVzZWRJbnNpZGUucHVzaF9iYWNrKGNvbG9yW3VdKTsKICAgICAgICBkZWx0YV9vbmx5X2luc2lkZVtjb2xvclt1XV0gKz0gc3pbdV07CiAgICAgICAgZGVsdGFfYWxsX2luc2lkZVtjb2xvclt1XV0gKz0gc3pbdV07CiAgICB9CiAgICBlbHNlIGlmIChjbnRbY29sb3JbdV1dID09IDIpIHsgCiAgICAgICAgc3VtX29ubHlfaW5zaWRlIC09IHN6W3VdOwogICAgICAgIGRlbHRhX29ubHlfaW5zaWRlW2NvbG9yW3VdXSAtPSBzelt1XTsKICAgIH0KCiAgICBmb3IgKGF1dG8gW3Ysd10gOiBhZGpbdV0pIHsKICAgICAgICBpZiAodiA9PSBwIHx8IGJhbm5lZFt2XSkgY29udGludWU7CiAgICAgICAgY250SW5zaWRlKHYsIHUpOwogICAgfQoKICAgIC0tY250W2NvbG9yW3VdXTsKfQoKdm9pZCBhZGRSb290UGF0aHMoaW50IHUsIGludCBwLCBpbnQgZGlzdGluY3QpIHsKICAgIGJvb2wgZmlyc3QgPSAoKytjbnRbY29sb3JbdV1dID09IDEpOwogICAgaWYgKGZpcnN0KSBkaXN0aW5jdCsrOwogICAgZWxzZSBpZiAoY250W2NvbG9yW3VdXSA9PSAyKSBkaXN0aW5jdC0tOwoKICAgIGFucyArPSAyICogZGlzdGluY3Q7CgogICAgZm9yIChhdXRvIFt2LCB3XSA6IGFkalt1XSkgewogICAgICAgIGlmICh2ID09IHAgfHwgYmFubmVkW3ZdKSBjb250aW51ZTsKICAgICAgICBhZGRSb290UGF0aHModiwgdSwgZGlzdGluY3QpOwogICAgfQogICAgLS1jbnRbY29sb3JbdV1dOwp9Cgp2b2lkIGRmcyhpbnQgdSwgaW50IHAsIGludCBlZGdlX2NvbG9yLCBpbnQgb25seV9jdXIsIGludCBhbGxfY3VyLCBpbnQgb25seV9vdXQsIGludCBkaXN0aW5jdGxlbiwgaW50IHZlcl9vdXQpIHsKICAgIGludCBDID0gZWRnZV9jb2xvcjsKICAgIGJvb2wgZmlyc3QgPSAoKytjbnRbQ10gPT0gMSk7CgogICAgaWYgKGZpcnN0KSB7CiAgICAgICAgZGlzdGluY3RsZW4rKzsKICAgICAgICBhbGxfY3VyICs9IGRlbHRhX2FsbFtDXSAtIGRlbHRhX2FsbF9pbnNpZGVbQ107CiAgICAgICAgb25seV9jdXIgKz0gZGVsdGFfb25seVtDXSAtIGRlbHRhX29ubHlfaW5zaWRlW0NdOwogICAgfQogICAgZWxzZSBpZiAoY250W0NdID09IDIpIHsKICAgICAgICBkaXN0aW5jdGxlbi0tOwogICAgICAgIGFsbF9jdXIgLT0gZGVsdGFfYWxsW0NdIC0gZGVsdGFfYWxsX2luc2lkZVtDXTsKICAgIH0KCiAgICBhbnMgKz0gZGlzdGluY3RsZW4gKiB2ZXJfb3V0IC0gYWxsX2N1ciAtIG9ubHlfY3VyICsgb25seV9vdXQ7CgogICAgZm9yIChhdXRvIFt2LHddIDogYWRqW3VdKSB7CiAgICAgICAgaWYgKHYgPT0gcCB8fCBiYW5uZWRbdl0pIGNvbnRpbnVlOwogICAgICAgIGRmcyh2LCB1LCB3LCBvbmx5X2N1ciwgYWxsX2N1ciwgb25seV9vdXQsIGRpc3RpbmN0bGVuLCB2ZXJfb3V0KTsKICAgIH0KCiAgICAtLWNudFtDXTsKfQoKdm9pZCBzb2x2ZShpbnQgdSkgewogICAgZ2V0X3N6KHUsIDApOwoKICAgIGludCByb290ID0gZmluZF9jZW4odSwgMCwgc3pbdV0pOwogICAgb3JpZW50X2NvbG9yKHJvb3QsIDApOwogICAgCiAgICBjdXJyZW50X3Jvb3QgPSByb290OwogICAgc3VtX29ubHkgPSAwOwogICAgY291bnRDaGlsZChyb290LCAwKTsKICAgIGludCBhbGxfbm9kZSA9IHN6W3Jvb3RdOwogICAgCiAgICBmb3IgKGF1dG8gW3Ysd10gOiBhZGpbcm9vdF0pIHsKICAgICAgICBpZiAoYmFubmVkW3ZdKSBjb250aW51ZTsKICAgICAgICBhZGRSb290UGF0aHModiwgcm9vdCwgMCk7CiAgICB9CgogICAgZm9yIChhdXRvIFt2LHddIDogYWRqW3Jvb3RdKSB7CiAgICAgICAgaWYgKGJhbm5lZFt2XSkgY29udGludWU7CgogICAgICAgIHN1bV9vbmx5X2luc2lkZSA9IDA7CiAgICAgICAgY250SW5zaWRlKHYsIHJvb3QpOwogICAgICAgIGludCB2ZXJfb3V0ID0gYWxsX25vZGUgLSBzelt2XSAtIDE7CiAgICAgICAgaW50IG9ubHlfb3V0ID0gc3VtX29ubHkgLSBzdW1fb25seV9pbnNpZGU7CgogICAgICAgIGRmcyh2LCByb290LCB3LCAwLCAwLCBvbmx5X291dCwgMCwgdmVyX291dCk7CgogICAgICAgIGZvciAoaW50IGMgOiB1c2VkSW5zaWRlKSB7CiAgICAgICAgICAgIGRlbHRhX2FsbF9pbnNpZGVbY10gPSAwOwogICAgICAgICAgICBkZWx0YV9vbmx5X2luc2lkZVtjXT0wOwogICAgICAgIH0KICAgICAgICB1c2VkSW5zaWRlLmNsZWFyKCk7CiAgICB9CgogICAgYmFubmVkW3Jvb3RdID0gMTsKICAgIGZvciAoaW50IGMgOiB1c2VkRGVsdGEpIHsKICAgICAgICBkZWx0YV9hbGxbY10gPSAwOwogICAgICAgIGRlbHRhX29ubHlbY109MDsKICAgIH0KICAgIHVzZWREZWx0YS5jbGVhcigpOwogICAgZm9yIChhdXRvIFt2LHddIDogYWRqW3Jvb3RdKSB7CiAgICAgICAgaWYgKCFiYW5uZWRbdl0pIHNvbHZlKHYpOwogICAgfQp9CgpzaWduZWQgbWFpbigpCnsKICAgIGl0YWNoaQogICAgY2luPj5uOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsKICAgICAgICBpbnQgdSwgdiwgdzsKICAgICAgICBjaW4gPj4gdSA+PiB2ID4+IHc7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh7dix3fSk7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh7dSx3fSk7CiAgICB9CgogICAgc29sdmUoMSk7CiAgICBjb3V0IDw8IGFucyAvIDI7CiAgICByZXR1cm4gMDsKfQ==