#include <bits/stdc++.h>
using namespace std;
const int maxp = 25;
const int maxnum = 10000001;
const int mod = 1000000007;
const int maxn = 100010;
int root = 1;
int a[maxn], u[maxn], v[maxn], x[maxn];
vector<int> prime, maxpow, g[maxn];
bool check[maxnum];
long long ans[maxn], cur[maxp][maxn];
int node[maxn], father[maxn][maxp], dep[maxn];
vector<int> power[maxn * 10], corres[maxn * 10];
void link(int u, int v) {
  g[u].push_back(v);
  g[v].push_back(u);
}
void sieve(int n) {
  for (int i = 2; i <= n; i++) {
    if (!check[i]) prime.push_back(i), maxpow.push_back(0);
    for (int j = 0; j < prime.size() && prime[j] * i <= n; j++)
      check[prime[j] * i] = true;
  }
}
void fact(int x, int id) {
  for (int i = 0; i < prime.size() && prime[i] * prime[i] <= x; i++) {
    int cnt = 0;
    while (x != 0 && x % prime[i] == 0) cnt++, x /= prime[i];
    power[i].push_back(cnt);
    corres[i].push_back(id);
  }
  if (x != 1) {
    int i = lower_bound(prime.begin(), prime.end(), x) - prime.begin();
    power[i].push_back(1);
    corres[i].push_back(id);
  }
}
inline int getpow(int x, int p) {
  int cnt = 0;
  while (x % p == 0 && x != 0) x /= p, cnt++;
  return cnt;
}
inline int qpow(int x, int p) {
  long long ret = 1LL, t = x;
  while (p) {
    if (p & 1) ret = ret * t % mod;
    t = t * t % mod;
    p >>= 1;
  }
  return ret;
}
void dfsl(int u, int p) {
  for (auto v : g[u]) {
    if (v != p) {
      father[v][0] = u;
      dep[v] = dep[u] + 1;
      dfsl(v, u);
    }
  }
}
void initlca(int n) {
  dep[root] = 0;
  dfsl(root, 0);
  for (int j = 1; j < maxp; j++) {
    for (int i = 1; i <= n; i++) {
      father[i][j] = father[father[i][j - 1]][j - 1];
    }
  }
}
int getlca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  for (int i = maxp - 1; i >= 0; i--) {
    if (dep[u] - dep[v] >= (1 << i)) u = father[u][i];
  }
  for (int i = maxp - 1; i >= 0; i--) {
    if (father[u][i] != father[v][i]) {
      u = father[u][i];
      v = father[v][i];
    }
  }
  if (u != v)
    return father[u][0];
  else
    return u;
}
void dfs(int u, int p, int c) {
  for (auto v : g[u]) {
    if (v != p) {
      cur[c][v] = cur[c][u] + node[v];
      dfs(v, u, c);
    }
  }
}
void solve(int n, int q) {
  static int p[maxn];
  initlca(n);
  for (int i = 0; i < prime.size(); i++) {
    if (power[i].size() == 0) continue;
    for (int j = 1; j <= n; j++) p[j] = getpow(a[j], prime[i]);
    for (auto j : power[i]) {
      for (int k = 1; k <= n; k++) node[k] = min(p[k], j);
      cur[j][root] = node[root];
      dfs(root, 0, j);
    }
    for (auto j : corres[i]) {
      int t = getpow(x[j], prime[i]);
      if (t == 0) continue;
      int lca = getlca(u[j], v[j]);
      long long b = cur[t][u[j]] + cur[t][v[j]] - cur[t][lca] -
                    (father[lca][0] ? cur[t][father[lca][0]] : 0);
      ans[j] = ans[j] * (long long)qpow(prime[i], b) % mod;
    }
  }
}
int main() {
  int n, q;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    link(u, v);
  }
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  scanf("%d", &q);
  int maxnum = 0;
  for (int i = 1; i <= q; i++)
    scanf("%d%d%d", &u[i], &v[i], &x[i]), maxnum = max(maxnum, x[i]),
                                          ans[i] = 1;
  sieve(maxnum);
  for (int i = 1; i <= n; i++) fact(x[i], i);
  for (int i = 0; i < prime.size(); i++)
    sort(power[i].begin(), power[i].end()),
        power[i].erase(unique(power[i].begin(), power[i].end()),
                       power[i].end());
  solve(n, q);
  for (int i = 1; i <= q; i++) printf("%lld\n", ans[i]);
  return 0;
}
