#include <bits/stdc++.h>
const long long md = 1e9 + 7;
const int Inf = 1e9;
const long long Inf64 = 1e18;
const long long MaxN = 1e5 + 10;
const long long LogN = 25;
const long long MaxM = 5e5 + 10;
const long double eps = 1e-7;
const long long dx[4] = {0, 1, 0, -1};
const long long dy[4] = {1, 0, -1, 0};
const long long ddx[4] = {1, 1, -1, -1};
const long long ddy[4] = {1, -1, 1, -1};
const long double Pi = acos(-1);
using namespace std;
template <typename T>
istream &operator>>(istream &in, pair<T, T> &a) {
  in >> a.first >> a.second;
  return in;
}
template <typename T>
ostream &operator<<(ostream &out, pair<T, T> a) {
  out << a.first << ' ' << a.second;
  return out;
}
template <typename T>
istream &operator>>(istream &in, vector<T> &Mt) {
  for (T &a : Mt) in >> a;
  return in;
}
template <typename T>
ostream &operator<<(ostream &out, vector<T> Mt) {
  for (int i = 0; i < Mt.size(); i++) {
    out << Mt[i];
    if (i != Mt.size()) out << ' ';
  }
  return out;
}
inline long long Mod(long long &a, long long m = md) {
  while (a >= m) a -= m;
  return a;
}
inline long long gcd(long long a, long long b) {
  while (a) {
    b %= a;
    swap(a, b);
  }
  return b;
}
inline long long gcdex(long long a, long long mod = md) {
  long long g = mod, r = a, x = 0, y = 1;
  while (r != 0) {
    long long q = g / r;
    g %= r;
    swap(g, r);
    x -= q * y;
    swap(x, y);
  }
  return x < 0 ? x + mod : x;
}
inline long long binpow(long long a, long long n, long long m = md) {
  long long res = 1;
  while (n) {
    if (n & 1) {
      res *= a;
      res %= m;
    }
    a *= a;
    a %= m;
    n >>= 1;
  }
  return res % md;
}
map<pair<long long, long long>, long long> Mp;
vector<pair<long long, long long> > Ans;
vector<long long> Gr[MaxN];
long long dp[MaxN][LogN];
long long Ht[MaxN];
long long Mt[MaxN];
void dfs1(long long v, long long p = 0) {
  dp[v][0] = p;
  for (int i = 1; i < LogN; i++) {
    dp[v][i] = dp[dp[v][i - 1]][i - 1];
  }
  Ht[v] = Ht[p] + 1;
  for (long long to : Gr[v]) {
    if (to == p) continue;
    dfs1(to, v);
  }
}
long long LCA(long long v, long long u) {
  if (Ht[u] > Ht[v]) swap(u, v);
  for (int i = LogN - 1; i >= 0; i--) {
    if (Ht[dp[v][i]] >= Ht[u]) v = dp[v][i];
  }
  if (u != v) {
    for (int i = LogN - 1; i >= 0; i--) {
      if (dp[v][i] != dp[u][i]) {
        v = dp[v][i];
        u = dp[u][i];
      }
    }
    v = dp[v][0];
    u = dp[u][0];
  }
  return u;
}
long long dfs2(long long v, long long p = 0) {
  long long k = 0;
  for (long long to : Gr[v]) {
    if (to == p) continue;
    k += dfs2(to, v);
  }
  k += Mt[v];
  Mp[{min(v, p), max(v, p)}] += k;
  return k;
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << fixed, cout.precision(20);
  {
    long long N;
    cin >> N;
    for (int i = 0; i < N - 1; i++) {
      long long a, b;
      cin >> a >> b;
      Gr[a].push_back(b);
      Gr[b].push_back(a);
      Ans.push_back({min(a, b), max(a, b)});
    }
    dfs1(1, 0);
    long long q;
    cin >> q;
    while (q--) {
      long long a, b;
      cin >> a >> b;
      long long lca = LCA(a, b);
      Mt[a]++;
      Mt[b]++;
      Mt[lca] -= 2;
    }
    dfs2(1, 0);
    for (pair<long long, long long> a : Ans) {
      cout << Mp[a] << ' ';
    }
  }
END:
  return 0;
}
