#include <bits/stdc++.h>
using namespace std;
int fa[5005], h[5005], f[5005];
int n, m, x, y;
struct {
  int u, v;
} a[5005];
struct node {
  int a, b, g;
} b[5005];
vector<int> ver[5005];
void dfs(int x, int lst) {
  fa[x] = lst;
  h[x] = h[lst] + 1;
  for (int i = 0; i < ver[x].size(); i++) {
    int y = ver[x][i];
    if (y == lst) continue;
    dfs(y, x);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    f[i] = 1;
  }
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &x, &y);
    a[i].u = x, a[i].v = y;
    ver[x].push_back(y);
    ver[y].push_back(x);
  }
  dfs(1, 0);
  scanf("%d", &m);
  for (int i = 0; i < m; i++) {
    scanf("%d%d%d", &b[i].a, &b[i].b, &b[i].g);
    x = b[i].a, y = b[i].b;
    while (x != y) {
      if (h[x] > h[y]) {
        f[x] = max(f[x], b[i].g);
        x = fa[x];
      } else {
        f[y] = max(f[y], b[i].g);
        y = fa[y];
      }
    }
  }
  bool ff = 1;
  for (int i = 0; i < m; i++) {
    int res = 0x3f3f3f3f;
    x = b[i].a, y = b[i].b;
    while (x != y) {
      if (h[x] > h[y]) {
        res = min(res, f[x]);
        x = fa[x];
      } else {
        res = min(res, f[y]);
        y = fa[y];
      }
    }
    if (res != b[i].g) {
      ff = 0;
      break;
    }
  }
  if (!ff) {
    puts("-1");
  } else {
    for (int i = 1; i < n; i++) {
      int res;
      x = a[i].u, y = a[i].v;
      if (h[x] < h[y]) swap(x, y);
      printf("%d ", f[x]);
    }
  }
}
