#include <bits/stdc++.h>
using namespace std;
const int maxn = 5000 + 10;
int n;
int m;
int lg[maxn];
int depth[maxn];
int fa[maxn][22];
int edgenum[maxn];
int w[maxn];
struct Edge {
  int to, next, idx;
} e[maxn << 1];
int head[maxn];
int en;
void add(int from, int to, int idx) {
  e[en].next = head[from];
  e[en].to = to;
  e[en].idx = idx;
  head[from] = en;
  ++en;
}
void dfs(int u, int pre) {
  depth[u] = depth[pre] + 1;
  fa[u][0] = pre;
  for (int i = 1; i <= lg[depth[u] - 1]; ++i) {
    fa[u][i] = fa[fa[u][i - 1]][i - 1];
  }
  for (int i = head[u]; i != -1; i = e[i].next) {
    int v = e[i].to;
    int id = e[i].idx;
    if (v == pre) continue;
    edgenum[v] = id;
    dfs(v, u);
  }
}
int LCA(int p, int q) {
  if (depth[p] < depth[q]) swap(p, q);
  while (depth[p] > depth[q]) {
    p = fa[p][lg[depth[p] - depth[q]]];
  }
  if (p == q) return p;
  for (int i = lg[depth[p] - 1]; i >= 0; --i) {
    if (fa[p][i] != fa[q][i]) {
      p = fa[p][i];
      q = fa[q][i];
    }
  }
  return fa[p][0];
}
void modify(int u, int v, int val) {
  int lca = LCA(u, v);
  while (u != lca) {
    w[edgenum[u]] = max(w[edgenum[u]], val);
    u = fa[u][0];
  }
  while (v != lca) {
    w[edgenum[v]] = max(w[edgenum[v]], val);
    v = fa[v][0];
  }
}
int que(int u, int v) {
  int mi = 1000001;
  int lca = LCA(u, v);
  while (u != lca) {
    mi = min(mi, w[edgenum[u]]);
    u = fa[u][0];
  }
  while (v != lca) {
    mi = min(mi, w[edgenum[v]]);
    v = fa[v][0];
  }
  return mi;
}
int main() {
  memset(head, -1, sizeof(head));
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    add(u, v, i);
    add(v, u, i);
  }
  scanf("%d", &m);
  vector<vector<int>> query(m + 1, vector<int>(3, 0));
  for (int i = 1; i <= m; ++i) {
    scanf("%d %d %d", &query[i][0], &query[i][1], &query[i][2]);
  }
  lg[1] = 0;
  lg[2] = 1;
  for (int i = 3; i <= n; ++i) {
    if (i == (1 << (lg[i - 1] + 1))) {
      lg[i] = lg[i - 1] + 1;
    } else {
      lg[i] = lg[i - 1];
    }
  }
  dfs(1, 0);
  for (int i = 1; i <= m; ++i) {
    int u = query[i][0];
    int v = query[i][1];
    int val = query[i][2];
    modify(u, v, val);
  }
  for (int i = 1; i <= m; ++i) {
    int u = query[i][0];
    int v = query[i][1];
    int val = query[i][2];
    int q = que(u, v);
    if (q != val) {
      printf("-1");
      return 0;
    }
  }
  for (int i = 1; i <= n - 1; ++i) {
    if (w[i] == 0) w[i] = 1;
    printf("%d ", w[i]);
  }
  return 0;
}
