#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
#define int long long
using namespace std;
int n;
int color[maxn], sz[maxn];
bool banned[maxn];
int par[maxn];
vector<pair<int,int>> adj[maxn];
int ans=0;
int cnt[maxn];
int delta_only[maxn],delta_all[maxn];
int delta_only_inside[maxn],delta_all_inside[maxn];
int sum_only = 0;
int sum_only_inside = 0;
vector<int> 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 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{
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{
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) {
current_root = 0;
sum_only = 0;
countChild(u, 0);
int root = find_cen(u, 0, sz[u]);
for (int c : usedDelta) {
delta_all[c]=0;
delta_only[c]=0;
}
usedDelta.clear();
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);
}
}
void pre_dfs(int u,int p){
for(auto [v,w] : adj[u]){
if(v==p) continue;
par[v]=u;
pre_dfs(v,u);
}
}
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});
}
pre_dfs(1,0);
for(int i=1;i<=n;i++){
for(auto [v,w] : adj[i]){
if(par[v]==i) color[v]=w;
}
}
solve(1);
cout << ans / 2;
return 0;
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zLHVucm9sbC1sb29wcyIpCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIHN0aSBzdHJpbmcKI2RlZmluZSBpdGFjaGkgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApOwojZGVmaW5lIG1heG4gNTAwMDA1CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBsZGIgbG9uZyBkb3VibGUKI2RlZmluZSBpbnQgbG9uZyBsb25nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbjsKaW50IGNvbG9yW21heG5dLCBzelttYXhuXTsKYm9vbCBiYW5uZWRbbWF4bl07CmludCBwYXJbbWF4bl07CnZlY3RvcjxwYWlyPGludCxpbnQ+PiBhZGpbbWF4bl07CgppbnQgYW5zPTA7CmludCBjbnRbbWF4bl07CmludCBkZWx0YV9vbmx5W21heG5dLGRlbHRhX2FsbFttYXhuXTsKaW50IGRlbHRhX29ubHlfaW5zaWRlW21heG5dLGRlbHRhX2FsbF9pbnNpZGVbbWF4bl07CmludCBzdW1fb25seSA9IDA7CmludCBzdW1fb25seV9pbnNpZGUgPSAwOwp2ZWN0b3I8aW50PiB1c2VkRGVsdGEsIHVzZWRJbnNpZGU7CmludCBjdXJyZW50X3Jvb3QgPSAwOwoKdm9pZCBvcmllbnRfY29sb3IoaW50IHUsIGludCBwKSB7CiAgICBmb3IgKGF1dG8gW3YsIHddIDogYWRqW3VdKSB7CiAgICAgICAgaWYgKHYgPT0gcCB8fCBiYW5uZWRbdl0pIGNvbnRpbnVlOwogICAgICAgIGNvbG9yW3ZdID0gdzsKICAgICAgICBvcmllbnRfY29sb3IodiwgdSk7CiAgICB9Cn0KCnZvaWQgY291bnRDaGlsZChpbnQgdSwgaW50IHApIHsKICAgIHN6W3VdID0gMTsKICAgIGJvb2wgZmlyc3QgPSBmYWxzZTsKICAgIGlmICh1ICE9IGN1cnJlbnRfcm9vdCkgZmlyc3QgPSAoKytjbnRbY29sb3JbdV1dID09IDEpOwogICAgZm9yIChhdXRvIFt2LHddIDogYWRqW3VdKSB7CiAgICAgICAgaWYgKHYgPT0gcCB8fCBiYW5uZWRbdl0pIGNvbnRpbnVlOwogICAgICAgIGNvdW50Q2hpbGQodiwgdSk7CiAgICAgICAgc3pbdV0gKz0gc3pbdl07CiAgICB9CiAgICBpZiAodSAhPSBjdXJyZW50X3Jvb3QpIHsKICAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgICAgc3VtX29ubHkgKz0gc3pbdV07CiAgICAgICAgICAgIGlmIChkZWx0YV9hbGxbY29sb3JbdV1dID09IDApIHVzZWREZWx0YS5wdXNoX2JhY2soY29sb3JbdV0pOwogICAgICAgICAgICBkZWx0YV9hbGxbY29sb3JbdV1dICs9IHN6W3VdOwogICAgICAgICAgICBkZWx0YV9vbmx5W2NvbG9yW3VdXSArPSBzelt1XTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgc3VtX29ubHkgLT0gc3pbdV07CiAgICAgICAgICAgIGRlbHRhX29ubHlbY29sb3JbdV1dIC09IHN6W3VdOwogICAgICAgIH0KICAgICAgICAtLWNudFtjb2xvclt1XV07CiAgICB9Cn0KCmludCBmaW5kX2NlbihpbnQgdSwgaW50IHAsIGludCBTKSB7CiAgICBmb3IgKGF1dG8gW3Ysd10gOiBhZGpbdV0pIHsKICAgICAgICBpZiAodiAhPSBwICYmICFiYW5uZWRbdl0gJiYgc3pbdl0gPiBTIC8gMikgewogICAgICAgICAgICByZXR1cm4gZmluZF9jZW4odiwgdSwgUyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHU7Cn0KCnZvaWQgY250SW5zaWRlKGludCB1LCBpbnQgcCkgewogICAgYm9vbCBmaXJzdCA9ICgrK2NudFtjb2xvclt1XV0gPT0gMSk7CgogICAgaWYgKGZpcnN0KSB7CiAgICAgICAgc3VtX29ubHlfaW5zaWRlICs9IHN6W3VdOwogICAgICAgIGlmIChkZWx0YV9hbGxfaW5zaWRlW2NvbG9yW3VdXSA9PSAwKSB1c2VkSW5zaWRlLnB1c2hfYmFjayhjb2xvclt1XSk7CiAgICAgICAgZGVsdGFfb25seV9pbnNpZGVbY29sb3JbdV1dICs9IHN6W3VdOwogICAgICAgIGRlbHRhX2FsbF9pbnNpZGVbY29sb3JbdV1dICs9IHN6W3VdOwogICAgfQogICAgZWxzZXsKICAgICAgICBzdW1fb25seV9pbnNpZGUgLT0gc3pbdV07CiAgICAgICAgZGVsdGFfb25seV9pbnNpZGVbY29sb3JbdV1dIC09IHN6W3VdOwogICAgfQoKICAgIGZvciAoYXV0byBbdix3XSA6IGFkalt1XSkgewogICAgICAgIGlmICh2ID09IHAgfHwgYmFubmVkW3ZdKSBjb250aW51ZTsKICAgICAgICBjbnRJbnNpZGUodiwgdSk7CiAgICB9CgogICAgLS1jbnRbY29sb3JbdV1dOwp9Cgp2b2lkIGFkZFJvb3RQYXRocyhpbnQgdSwgaW50IHAsIGludCBkaXN0aW5jdCkgewogICAgYm9vbCBmaXJzdCA9ICgrK2NudFtjb2xvclt1XV0gPT0gMSk7CiAgICBpZiAoZmlyc3QpIGRpc3RpbmN0Kys7CiAgICBlbHNlIGlmIChjbnRbY29sb3JbdV1dID09IDIpIGRpc3RpbmN0LS07CgogICAgYW5zICs9IDIgKiBkaXN0aW5jdDsKCiAgICBmb3IgKGF1dG8gW3YsIHddIDogYWRqW3VdKSB7CiAgICAgICAgaWYgKHYgPT0gcCB8fCBiYW5uZWRbdl0pIGNvbnRpbnVlOwogICAgICAgIGFkZFJvb3RQYXRocyh2LCB1LCBkaXN0aW5jdCk7CiAgICB9CiAgICAtLWNudFtjb2xvclt1XV07Cn0KCnZvaWQgZGZzKGludCB1LCBpbnQgcCxpbnQgZWRnZV9jb2xvciwgaW50IG9ubHlfY3VyLCBpbnQgYWxsX2N1cixpbnQgb25seV9vdXQsCiAgICAgICAgIGludCBkaXN0aW5jdGxlbixpbnQgdmVyX291dCkgewogICAgaW50IEM9ZWRnZV9jb2xvcjsKICAgIGJvb2wgZmlyc3QgPSAoKytjbnRbQ10gPT0gMSk7CgogICAgaWYgKGZpcnN0KSB7CiAgICAgICAgZGlzdGluY3RsZW4rKzsKICAgICAgICBhbGxfY3VyICs9IGRlbHRhX2FsbFtDXSAtIGRlbHRhX2FsbF9pbnNpZGVbQ107CiAgICAgICAgb25seV9jdXIgKz0gZGVsdGFfb25seVtDXSAtIGRlbHRhX29ubHlfaW5zaWRlW0NdOwogICAgfQogICAgZWxzZSBpZiAoY250W0NdID09IDIpIHsKICAgICAgICBkaXN0aW5jdGxlbi0tOwogICAgICAgIGFsbF9jdXIgLT0gZGVsdGFfYWxsW0NdIC0gZGVsdGFfYWxsX2luc2lkZVtDXTsKICAgIH0KCiAgICBhbnMgKz0gZGlzdGluY3RsZW4gKiB2ZXJfb3V0IC0gYWxsX2N1ciAtIG9ubHlfY3VyICsgb25seV9vdXQ7CgogICAgZm9yIChhdXRvIFt2LHddIDogYWRqW3VdKSB7CiAgICAgICAgaWYgKHYgPT0gcCB8fCBiYW5uZWRbdl0pIGNvbnRpbnVlOwogICAgICAgIGRmcyh2LCB1LCB3LG9ubHlfY3VyLGFsbF9jdXIsb25seV9vdXQsZGlzdGluY3RsZW4sdmVyX291dCk7CiAgICB9CgogICAgLS1jbnRbQ107Cn0KCnZvaWQgc29sdmUoaW50IHUpIHsKICAgIGN1cnJlbnRfcm9vdCA9IDA7CiAgICBzdW1fb25seSA9IDA7CiAgICBjb3VudENoaWxkKHUsIDApOwoKICAgIGludCByb290ID0gZmluZF9jZW4odSwgMCwgc3pbdV0pOwoKICAgIGZvciAoaW50IGMgOiB1c2VkRGVsdGEpIHsKICAgICAgICBkZWx0YV9hbGxbY109MDsKICAgICAgICBkZWx0YV9vbmx5W2NdPTA7CiAgICB9CiAgICB1c2VkRGVsdGEuY2xlYXIoKTsKICAgIG9yaWVudF9jb2xvcihyb290LCAwKTsKICAgIGN1cnJlbnRfcm9vdCA9IHJvb3Q7CiAgICBzdW1fb25seSA9IDA7CiAgICBjb3VudENoaWxkKHJvb3QsIDApOwogICAgaW50IGFsbF9ub2RlID0gc3pbcm9vdF07CiAgICBmb3IgKGF1dG8gW3Ysd10gOiBhZGpbcm9vdF0pIHsKICAgICAgICBpZiAoYmFubmVkW3ZdKSBjb250aW51ZTsKICAgICAgICBhZGRSb290UGF0aHModiwgcm9vdCwgMCk7CiAgICB9CgogICAgZm9yIChhdXRvIFt2LHddIDogYWRqW3Jvb3RdKSB7CiAgICAgICAgaWYgKGJhbm5lZFt2XSkgY29udGludWU7CgogICAgICAgIHN1bV9vbmx5X2luc2lkZSA9IDA7CiAgICAgICAgY250SW5zaWRlKHYsIHJvb3QpOwogICAgICAgIGludCB2ZXJfb3V0ID0gYWxsX25vZGUgLSBzelt2XSAtIDE7CiAgICAgICAgaW50IG9ubHlfb3V0ID0gc3VtX29ubHkgLSBzdW1fb25seV9pbnNpZGU7CgogICAgICAgIGRmcyh2LCByb290LCB3LCAwLCAwLCBvbmx5X291dCwgMCwgdmVyX291dCk7CgogICAgICAgIGZvciAoaW50IGMgOiB1c2VkSW5zaWRlKSB7CiAgICAgICAgICAgIGRlbHRhX2FsbF9pbnNpZGVbY10gPSAwOwogICAgICAgICAgICBkZWx0YV9vbmx5X2luc2lkZVtjXT0wOwogICAgICAgIH0KICAgICAgICB1c2VkSW5zaWRlLmNsZWFyKCk7CiAgICB9CgogICAgYmFubmVkW3Jvb3RdID0gMTsKICAgIGZvciAoaW50IGMgOiB1c2VkRGVsdGEpIHsKICAgICAgICBkZWx0YV9hbGxbY10gPSAwOwogICAgICAgIGRlbHRhX29ubHlbY109MDsKICAgIH0KICAgIHVzZWREZWx0YS5jbGVhcigpOwogICAgZm9yIChhdXRvIFt2LHddIDogYWRqW3Jvb3RdKSB7CiAgICAgICAgaWYgKCFiYW5uZWRbdl0pIHNvbHZlKHYpOwogICAgfQp9Cgp2b2lkIHByZV9kZnMoaW50IHUsaW50IHApewogICAgZm9yKGF1dG8gW3Ysd10gOiBhZGpbdV0pewogICAgICAgIGlmKHY9PXApIGNvbnRpbnVlOwogICAgICAgIHBhclt2XT11OwogICAgICAgIHByZV9kZnModix1KTsKICAgIH0KfQoKc2lnbmVkIG1haW4oKQp7CiAgICBpdGFjaGkKICAgIGNpbiA+PiBuOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsKICAgICAgICBpbnQgdSwgdix3OwogICAgICAgIGNpbiA+PiB1ID4+IHYgPj4gdzsKICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKHt2LHd9KTsKICAgICAgICBhZGpbdl0ucHVzaF9iYWNrKHt1LHd9KTsKICAgIH0KCiAgICBwcmVfZGZzKDEsMCk7CgogICAgZm9yKGludCBpPTE7aTw9bjtpKyspewogICAgICAgIGZvcihhdXRvIFt2LHddIDogYWRqW2ldKXsKICAgICAgICAgICAgaWYocGFyW3ZdPT1pKSBjb2xvclt2XT13OwogICAgICAgIH0KICAgIH0KICAgIHNvbHZlKDEpOwogICAgY291dCA8PCBhbnMgLyAyOwogICAgcmV0dXJuIDA7Cn0K