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