#define _USE_MATH_DEFINES #include using namespace std; //template #define rep(i,a,b) for(int i=(int)(a);i<(int)(b);i++) #define ALL(v) (v).begin(),(v).end() typedef long long int ll; const int inf = 0x3fffffff; const ll INF = 0x1fffffffffffffff; const double eps=1e-12; templateinline bool chmax(T& a,T b){if(ainline bool chmin(T& a,T b){if(a>b){a=b;return 1;}return 0;} //end typedef pair P; int n,k; vector

g[201010]; bool used[201010]={}; int find(int rt){ vector sz(n); function get=[&](int v,int p){ sz[v]=1; for(auto [t,c]:g[v])if(t!=p and !used[t]){ get(t,v); sz[v]+=sz[t]; } }; function dfs=[&](int v,int p){ for(auto [t,c]:g[v])if(t!=p and !used[t]){ if(sz[t]>sz[rt]/2)return dfs(t,v); } return v; }; get(rt,-1); return dfs(rt,-1); } ll res=0; vector

mp[201010],sum; void rec(int rt){ int cen=find(rt); used[cen]=1; for(auto [t,c]:g[cen])if(!used[t])rec(t); rep(i,0,g[cen].size())mp[i].clear(); sum.clear(); function dfs=[&](int v,int p,int idx,P col){ if(idx==-1){ for(auto [t,c]:g[v])if(!used[t])dfs(t,v,++idx,{-1,c}); return; } mp[idx].push_back(col); sum.push_back(col); for(auto [t,c]:g[v])if(t!=p and !used[t]){ P nxt=col; if(col.first!=-1){ if(col.first!=c and col.second!=c)continue; } else{ if(col.second!=c)nxt=minmax(col.second,c); } dfs(t,v,idx,nxt); } }; dfs(cen,-1,-1,{-1,-1}); sort(ALL(sum)); rep(i,0,g[cen].size()){ sort(ALL(mp[i])); for(auto p:mp[i]){ int a=p.first,b=p.second; if(a!=-1 and b!=-1){ //{-1,-1} res+=2; //{a,b} auto [lb,rb]=equal_range(ALL(sum),p); res+=rb-lb; auto [lb2,rb2]=equal_range(ALL(mp[i]),p); res-=rb2-lb2; //{-1,a} auto [lb3,rb3]=equal_range(ALL(sum),P{-1,a}); res+=2*(rb3-lb3); auto [lb4,rb4]=equal_range(ALL(mp[i]),P{-1,a}); res-=2*(rb4-lb4); //{-1,b} auto [lb5,rb5]=equal_range(ALL(sum),P{-1,b}); res+=2*(rb5-lb5); auto [lb6,rb6]=equal_range(ALL(mp[i]),P{-1,b}); res-=2*(rb6-lb6); } else{ //{-1,b},{a,b} res+=upper_bound(ALL(sum),P{-1,INF})-lower_bound(ALL(sum),P{-1,0}); auto [lb,rb]=equal_range(ALL(sum),p); res-=rb-lb; res-=upper_bound(ALL(mp[i]),P{-1,INF})-lower_bound(ALL(mp[i]),P{-1,0}); auto [lb2,rb2]=equal_range(ALL(mp[i]),p); res+=rb2-lb2; } } //cerr<>n>>k; rep(_,0,n-1){ int x,y,z; cin>>x>>y>>z; x--; y--; g[x].push_back({y,z}); g[y].push_back({x,z}); } rec(0); cout<