func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m;   int U[5005], V[5005];   struct emm {     int a, b, x;   } a[5005];   bool cmp(emm x, emm y) { return x.x < y.x; }   struct Edge {     int v;     Edge *next;   } pool[5005 << 1], *h[5005];   int fa[5005], dep[5005], ans[5005];   int tot;   void addEdge(int u, int v) {     Edge *p = &pool[tot++];     p->v = v;     p->next = h[u];     h[u] = p;   }   void dfs(int u) {     for (Edge *p = h[u]; p; p = p->next) {       int v = p->v;       if (v == fa[u]) continue;       dep[v] = dep[u] + 1;       fa[v] = u;       dfs(v);     }   }   int LCA(int u, int v) {     if (dep[u] < dep[v]) swap(u, v);     while (dep[u] > dep[v]) {       u = fa[u];     }     if (u == v) return u;     while (fa[u] != fa[v]) {       u = fa[u];       v = fa[v];     }     return fa[u];   }   void update(int u, int v, int x) {     if (u == v) return;     while (u != v) {       ans[u] = x;       u = fa[u];     }   }   int check(int u, int v) {     int res = 0x3f3f3f3f;     if (u == v) return res;     while (u != v) {       res = min(res, ans[u]);       u = fa[u];     }     return res;   }   int main() {     scanf( %d , &n);     for (int i = 1; i < n; i++) {       scanf( %d%d , &U[i], &V[i]);       addEdge(U[i], V[i]);       addEdge(V[i], U[i]);     }     dep[1] = 1;     dfs(1);     scanf( %d , &m);     for (int i = 1; i <= m; i++) scanf( %d%d%d , &a[i].a, &a[i].b, &a[i].x);     sort(a + 1, a + m + 1, cmp);     for (int i = 1; i <= m; i++) {       int t = LCA(a[i].a, a[i].b);       update(a[i].a, t, a[i].x);       update(a[i].b, t, a[i].x);     }     for (int i = 1; i <= m; i++) {       int t = LCA(a[i].a, a[i].b);       if (min(check(a[i].a, t), check(a[i].b, t)) != a[i].x) {         printf( -1 n );         return 0;       }     }     for (int i = 1; i < n; i++) {       if (dep[U[i]] < dep[V[i]]) swap(U[i], V[i]);       printf( %d  , max(ans[U[i]], 1));     }     printf(  n );     return 0;   }   