func_code_string: #include <bits/stdc++.h>   using namespace std;   set<int> st[200000 + 7];   set<int>::iterator it;   vector<int> graph[200000 + 7], edge[200000 + 7];   pair<int, int> edges[200000 + 7], path[200000 + 7];   int sid[200000 + 7], prio[200000 + 7], pr_id, can[200000 + 7], neg[200000 + 7],       rev[200000 + 7];   long long weg[200000 + 7], uwg[200000 + 7];   void dfs(int u, int edg) {     int v, ed;     long long wg = 0;     neg[u] = edg;     for (int i = 0; i < graph[u].size(); i++) {       v = graph[u][i];       ed = edge[u][i];       dfs(v, ed);       wg += weg[v];     }     if (u == 1) return;     prio[u] = ++pr_id;     rev[pr_id] = edg;     sid[u] = u;     st[u].insert(pr_id);     can[edg] = min(1LL * edges[edg].first - 1, edges[edg].second - wg);     if (can[edg] < 0) {       puts( -1 );       exit(0);     }     weg[u] = wg + edges[edg].first - can[edg];   }   void solve(int u) {     int v, id1, id2;     for (int i = 0; i < graph[u].size(); i++) {       v = graph[u][i];       solve(v);       uwg[u] += uwg[v];       id1 = sid[u];       id2 = sid[v];       if (st[id2].size() > st[id1].size()) swap(id1, id2);       for (it = st[id2].begin(); it != st[id2].end(); it++)         st[id1].insert(int(*it));       sid[u] = id1;     }     if (u == 1) return;     int temp;     while (uwg[u] > edges[neg[u]].second) {       temp = *st[sid[u]].begin();       temp = rev[temp];       if (uwg[u] - can[temp] >= edges[neg[u]].second) {         edges[temp].first -= can[temp];         edges[temp].second -= can[temp];         uwg[u] -= can[temp];         can[temp] = 0;         st[sid[u]].erase(st[sid[u]].begin());       } else {         int tpv = uwg[u] - edges[neg[u]].second;         edges[temp].first -= tpv;         edges[temp].second -= tpv;         uwg[u] -= tpv;         can[temp] -= tpv;       }     }     uwg[u] += edges[neg[u]].first;   }   int main() {     int n, u, v, w, p;     scanf( %d , &n);     for (int i = 1; i < n; i++) {       scanf( %d %d , &u, &v);       scanf( %d %d , &edges[i].first, &edges[i].second);       edge[u].push_back(i);       graph[u].push_back(v);       path[i] = make_pair(u, v);     }     dfs(1, 0);     solve(1);     printf( %d n , n);     for (int i = 1; i < n; i++)       printf( %d %d %d %d n , path[i].first, path[i].second, edges[i].first,              edges[i].second);     return 0;   }   