#include <bits/stdc++.h>   using namespace std;   template <class T1, class T2>   void pr(const pair<T1, T2>& x);   template <class T, size_t SZ>   void pr(const array<T, SZ>& x);   template <class T>   void pr(const vector<T>& x);   template <class T>   void pr(const set<T>& x);   template <class T1, class T2>   void pr(const map<T1, T2>& x);   template <class T>   void pr(const T& x) {     cout << x;   }   template <class Arg, class... Args>   void pr(const Arg& first, const Args&... rest) {     pr(first);     pr(rest...);   }   template <class T1, class T2>   void pr(const pair<T1, T2>& x) {     pr( { , x.first,  ,  , x.second,  } );   }   template <class T>   void prContain(const T& x) {     pr( { );     bool fst = 1;     for (auto& a : x) pr(!fst ?  ,   :   , a), fst = 0;     pr( } );   }   template <class T, size_t SZ>   void pr(const array<T, SZ>& x) {     prContain(x);   }   template <class T>   void pr(const vector<T>& x) {     prContain(x);   }   template <class T>   void pr(const set<T>& x) {     prContain(x);   }   template <class T1, class T2>   void pr(const map<T1, T2>& x) {     prContain(x);   }   void ps() { pr(  n ); }   template <class Arg, class... Args>   void ps(const Arg& first, const Args&... rest) {     pr(first,    );     ps(rest...);   }   template <typename T>   int remin(T& a, const T& b) {     if (b < a) {       a = b;       return true;     }     return false;   }   template <typename T>   int remax(T& a, const T& b) {     if (b > a) {       a = b;       return true;     }     return false;   }   int n;   int G[5005][5005];   short int nxt[5005][5005];   vector<unsigned short int> H[5005];   void dfs_parent(int from, vector<int>& p, int parent = -1) {     for (auto to : H[from])       if (to != parent) {         p[to] = from;         dfs_parent(to, p, from);       }   }   void dfs(int u, int v, int w, const vector<int>& p) {     while (u != v) {       int n = p[v];       remax(G[v][n], w);       remax(G[n][v], w);       v = n;     }   }   void check(int u, int v, int w, const vector<int>& p) {     int exp = 1E9;     while (u != v) {       int n = p[v];       if (G[v][n] == -1) {         G[v][n] = 1000000;         G[n][v] = 1000000;       }       remin(exp, G[v][n]);       v = n;     }     if (exp != w) {       printf( -1 n );       exit(0);     }   }   int main(int argc, const char** argv) {     scanf( %d , &n);     vector<pair<int, int>> edges;     for (int i = 0; i < n - 1; ++i) {       int u, v;       scanf( %d%d , &u, &v);       --u, --v;       G[u][v] = -1;       G[v][u] = -1;       edges.emplace_back(u, v);       H[u].push_back(v);       H[v].push_back(u);     }     vector<vector<int>> p(n, vector<int>(n, -1));     for (int u = 0; u < n; ++u) {       dfs_parent(u, p[u]);     }     int q;     scanf( %d , &q);     vector<pair<pair<int, int>, int>> qu(q);     for (int qq = 0; qq < q; ++qq) {       int u, v, w;       scanf( %d%d%d , &u, &v, &w);       --u, --v;       qu[qq] = make_pair(pair<int, int>(u, v), w);       dfs(u, v, w, p[u]);     }     for (auto [c, w] : qu) {       check(c.first, c.second, w, p[c.first]);     }     vector<int> ans(n - 1);     for (int i = 0; i < n - 1; ++i) {       int u = edges[i].first;       int v = edges[i].second;       int mn = min(u, v);       int mx = max(u, v);       printf( %d  , G[mn][mx] == -1 ? 1000000 : G[mn][mx]);     }     printf(  n );     return 0;   }