func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = (int)3e5 + 100;   vector<int> g[N];   vector<pair<int, int> > G[N];   map<int, long long> vToMinCost[N];   multiset<long long> costs[N];   long long addToAll[N];   int ansAt[N];   void upd(int id, int v, long long x) {     x -= addToAll[id];     if (vToMinCost[id].count(v) == 0 || vToMinCost[id][v] > x) {       if (vToMinCost[id].count(v) != 0)         costs[id].erase(costs[id].find(vToMinCost[id][v]));       vToMinCost[id][v] = x;       costs[id].insert(x);     }   }   void del(int id, int v) {     if (vToMinCost[id].count(v)) {       costs[id].erase(costs[id].find(vToMinCost[id][v]));       vToMinCost[id].erase(v);     }   }   void solve(int v, int par) {     ansAt[v] = v;     for (auto p : G[v]) upd(v, p.first, p.second);     for (int to : g[v]) {       if (to == par) continue;       solve(to, v);       int a = ansAt[v], b = ansAt[to];       if (vToMinCost[a].size() < vToMinCost[b].size()) swap(a, b);       del(a, to);       del(b, to);       if (vToMinCost[a].empty() || vToMinCost[b].empty()) {         printf( -1 n );         exit(0);       }       long long mn = *costs[b].begin() + addToAll[b];       long long mna = *costs[a].begin() + addToAll[a];       addToAll[a] += mn;       addToAll[b] += mna;       for (auto p : vToMinCost[b]) upd(a, p.first, p.second + addToAll[b]);       ansAt[v] = a;     }   }   int main(int, char **) {     int n, m;     scanf( %d%d , &n, &m);     for (int i = 0; i < n - 1; i++) {       int a, b;       scanf( %d%d , &a, &b);       a--;       b--;       g[a].push_back(b);       g[b].push_back(a);     }     for (int i = 0; i < n; i++) G[i].push_back(make_pair(i, 0));     for (int i = 0; i < m; i++) {       int a, b, c;       scanf( %d%d%d , &a, &b, &c);       a--;       b--;       G[a].push_back(make_pair(b, c));     }     solve(0, -1);     int id = ansAt[0];     long long ans = *costs[id].begin() + addToAll[id];     printf( %lld n , ans);     return 0;   }   