func_code_string: #include <bits/stdc++.h>   using namespace std;   inline int read() {     register int x = 0, t = 1;     register char ch = getchar();     while ((ch <  0  || ch >  9 ) && ch !=  - ) ch = getchar();     if (ch ==  - ) t = -1, ch = getchar();     while (ch <=  9  && ch >=  0 ) x = x * 10 + ch - 48, ch = getchar();     return x * t;   }   int n, m, top, first[301000], dep[301000];   struct mona {     int nxt, en;   } s[301000 << 1];   inline void Insert(int x, int y) {     s[++top] = (mona){first[x], y}, first[x] = top;   }   inline void Dfs(int k, int fa) {     dep[k] = dep[fa] + 1;     for (register int i = first[k]; i; i = s[i].nxt) {       int en = s[i].en;       if (en == fa) continue;       Dfs(en, k);     }     return;   }   int cnt, rt[301000], Min[301000], ls[301000], rs[301000];   pair<long long, int> val[301000];   long long lz[301000], ans;   inline int New(pair<long long, int> x) {     int t = ++cnt;     val[t] = x, Min[t] = 1;     return t;   }   inline void Pushlz(int x, long long w) { val[x].first += w, lz[x] += w; }   inline void Pushdown(int x) {     if (!lz[x]) return;     if (ls[x]) Pushlz(ls[x], lz[x]);     if (rs[x]) Pushlz(rs[x], lz[x]);     lz[x] = 0;   }   inline int Merge(int u, int v) {     if (!u || !v) return u | v;     int t;     if (val[u] < val[v])       Pushdown(u), rs[u] = Merge(rs[u], v), t = u;     else       Pushdown(v), rs[v] = Merge(u, rs[v]), t = v;     if (Min[ls[t]] < Min[rs[t]]) swap(ls[t], rs[t]);     Min[t] = Min[rs[t]] + 1;     return t;   }   inline void Dfs2(int k, int fa) {     for (register int i = first[k]; i; i = s[i].nxt) {       int en = s[i].en;       if (en == fa) continue;       Dfs2(en, k), rt[k] = Merge(rt[k], rt[en]);     }     while (rt[k] && val[rt[k]].second >= dep[k])       rt[k] = Merge(ls[rt[k]], rs[rt[k]]);     if (!rt[k] && k != 1) puts( -1 ), exit(0);     ans += val[rt[k]].first, Pushlz(rt[k], -val[rt[k]].first);   }   int main() {     n = read(), m = read();     for (register int i = 1; i < n; ++i) {       int x = read(), y = read();       Insert(x, y), Insert(y, x);     }     Dfs(1, 0);     for (register int i = 1; i <= m; ++i) {       int x = read(), y = read();       long long w = read();       if (dep[x] < dep[y]) swap(x, y);       rt[x] = Merge(rt[x], New(make_pair(w, dep[y])));     }     Dfs2(1, 0), printf( %lld n , ans);   }   