func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long N = 400010;   inline long long read() {     long long s = 0, w = 1;     register char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) w = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 )       s = (s << 3) + (s << 1) + (ch -  0 ), ch = getchar();     return s * w;   }   void print(long long x) {     if (x < 0) x = -x, putchar( - );     if (x > 9) print(x / 10);     putchar(x % 10 +  0 );   }   long long n, deg[N], root, cnt;   struct Node {     long long a, b, c;   } h[N];   long long head[N], maxE;   struct Edge {     long long nxt, to, rdis;   } e[N << 1];   inline void Add(long long u, long long v, long long w) {     e[++maxE].nxt = head[u];     head[u] = maxE;     e[maxE].to = v;     e[maxE].rdis = w;   }   long long DFS(long long x, long long fa, long long w) {     long long res;     long long p, q;     res = p = q = 0;     for (long long i = head[x]; i; i = e[i].nxt) {       if (e[i].to == fa) continue;       res += e[i].rdis;       long long gt = DFS(e[i].to, x, e[i].rdis);       (p ? q : p) = gt;     }     if (x == root) return p;     if (!p)       p = x, h[++cnt] = (Node){p, root, w};     else {       h[++cnt] = (Node){p, q, (res - w) / 2};       h[++cnt] = (Node){p, root, (w - res) / 2};       h[++cnt] = (Node){q, root, (w - res) / 2};     }     return p;   }   signed main() {     n = read();     for (register long long i = 1; i < n; i++) {       long long u, v, w;       u = read(), v = read(), w = read();       Add(u, v, w), Add(v, u, w);       deg[u]++, deg[v]++;     }     for (register long long i = 1; i <= n; i++) {       if (deg[i] == 2) {         puts( NO );         return 0;       }       if (deg[i] == 1) root = i;     }     puts( YES );     DFS(root, 0, 0);     printf( %lld n , cnt);     for (register long long i = 1; i <= cnt; i++)       printf( %lld %lld %lld n , h[i].a, h[i].b, h[i].c);     return 0;   }   