func_code_string: #include <bits/stdc++.h>   using namespace std;   char buf[1 << 15], *fs, *ft;   inline char getc() {     return (fs == ft &&             (ft = (fs = buf) + fread(buf, 1, 1 << 15, stdin), fs == ft))                ? 0                : *fs++;   }   inline int read() {     int x = 0, f = 1;     char ch = getc();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getc();     }     while (ch >=  0  && ch <=  9 ) {       x = x * 10 + ch -  0 ;       ch = getc();     }     return x * f;   }   const int MAXN = 200010;   int n, len;   long long ans, sz[MAXN][2];   int f[MAXN][2];   inline int getfather(int x, int y) {     return f[x][y] == x ? x : f[x][y] = getfather(f[x][y], y);   }   inline void merge(int x, int y, int z) {     int xx = getfather(x, z);     int yy = getfather(y, z);     sz[yy][z] += sz[xx][z];     f[xx][z] = yy;   }   int main() {     n = read();     for (int i = 1; i <= n; ++i) f[i][0] = f[i][1] = i, sz[i][0] = sz[i][1] = 1;     for (int i = 1; i < n; ++i) {       int x, y;       x = read();       y = read();       merge(x, y, read());     }     for (int i = 1; i <= n; ++i) {       int w1 = getfather(i, 0);       int w2 = getfather(i, 1);       if (w1 == i) ans += sz[w1][0] * (sz[w1][0] - 1);       if (w2 == i) ans += sz[w2][1] * (sz[w2][1] - 1);       ans += (sz[w1][0] - 1) * (sz[w2][1] - 1);     }     printf( %lld n , ans);     return 0;   }   