#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
void qread(int &x) {
  int neg = 1;
  x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') neg = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = 10 * x + c - '0', c = getchar();
  x *= neg;
}
const int maxn = 200005;
const int mod = 1e9 + 7;
int Add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
int Sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
int Mul(int a, int b) { return 1LL * a * b % mod; }
int n, k, cnt, top, res;
int a[maxn], pri[maxn], mu[maxn], inv[maxn], phi[maxn], s[maxn];
int f[maxn], g[maxn];
bool no[maxn];
vector<int> edge[maxn], fac[maxn], nedge[maxn], val[maxn];
int vis[maxn * 2], dep[maxn], st[maxn], dfn[maxn], par[maxn];
namespace Lca {
const int mlog = 20;
int l2[maxn * 2], mn[maxn * 2][mlog];
int Min(int a, int b) {
  if (a == 1e9) return b;
  if (b == 1e9) return a;
  return dep[a] < dep[b] ? a : b;
}
void init() {
  l2[0] = 0;
  for (int(i) = 1; (i) <= 2 * n; i++) {
    l2[i] = l2[i - 1];
    if (i == (1 << l2[i] + 1)) l2[i]++;
  }
  for (int(i) = 1; (i) <= k; i++) mn[i][0] = vis[i];
  for (int(j) = 1; (j) <= mlog - 1; j++)
    for (int(i) = 1; (i) <= k; i++) {
      if (i + (1 << j - 1) > k)
        mn[i][j] = 1e9;
      else
        mn[i][j] = Min(mn[i][j - 1], mn[i + (1 << j - 1)][j - 1]);
    }
}
int qry(int l, int r) {
  if (l > r) swap(l, r);
  int len = l2[r - l + 1];
  return Min(mn[l][len], mn[r - (1 << len) + 1][len]);
}
}  // namespace Lca
void dfs(int x, int p, int d) {
  vis[++k] = x;
  dfn[x] = k;
  dep[x] = d;
  for (int(i) = 0; (i) < fac[a[x]].size(); i++) val[fac[a[x]][i]].push_back(x);
  for (int(i) = 0; (i) < edge[x].size(); i++) {
    int y = edge[x][i];
    if (y == p) continue;
    dfs(y, x, d + 1);
    vis[++k] = x;
  }
}
vector<int> build(vector<int> v) {
  vector<int> nv = v;
  top = 0;
  for (int(i) = 0; (i) < v.size(); i++) {
    int x = v[i];
    if (!top) {
      st[++top] = x;
      par[x] = 0;
      continue;
    }
    int z = Lca::qry(dfn[x], dfn[st[top]]);
    while (top && dep[st[top]] > dep[z]) {
      if (dep[st[top - 1]] <= dep[z]) par[st[top]] = z;
      top--;
    }
    if (st[top] != z) {
      nv.push_back(z);
      par[z] = st[top];
      st[++top] = z;
    }
    par[x] = z;
    st[++top] = x;
  }
  return nv;
}
void precalc() {
  for (int(i) = 1; (i) <= n; i++)
    for (int(j) = 1; (j) <= n / i; j++) fac[i * j].push_back(i);
  inv[0] = inv[1] = phi[1] = mu[1] = 1;
  for (int i = 2; i <= n; i++) {
    inv[i] = Mul(mod - mod / i, inv[mod % i]);
    if (!no[i]) pri[++cnt] = i, phi[i] = i - 1, mu[i] = -1;
    for (int(j) = 1; (j) <= cnt; j++) {
      if (i * pri[j] > n) break;
      no[i * pri[j]] = true;
      if (i % pri[j] == 0) {
        mu[i * pri[j]] = 0;
        phi[i * pri[j]] = phi[i] * pri[j];
        break;
      }
      mu[i * pri[j]] = -mu[i];
      phi[i * pri[j]] = phi[i] * (pri[j] - 1);
    }
  }
}
void work(int x) {
  for (int(i) = 0; (i) < nedge[x].size(); i++) {
    int y = nedge[x][i];
    work(y);
    res = Sub(res, Mul(Mul(4, dep[x]), Mul(s[x], s[y])));
    s[x] = Add(s[x], s[y]);
  }
}
int calc(int d) {
  int tmp1 = 0, tmp2 = 0;
  res = 0;
  for (int(i) = 0; (i) < val[d].size(); i++) {
    int x = val[d][i];
    res = Add(res, Mul(tmp1, Mul(dep[x], phi[a[x]])));
    res = Add(res, Mul(tmp2, phi[a[x]]));
    tmp1 = Add(tmp1, phi[a[x]]);
    tmp2 = Add(tmp2, Mul(dep[x], phi[a[x]]));
  }
  res = Mul(res, 2);
  vector<int> cur = build(val[d]);
  for (int(i) = 0; (i) < cur.size(); i++) {
    nedge[par[cur[i]]].push_back(cur[i]);
    s[cur[i]] = (a[cur[i]] % d == 0) ? phi[a[cur[i]]] : 0;
  }
  work(0);
  for (int(i) = 0; (i) < cur.size(); i++) nedge[cur[i]].clear();
  nedge[0].clear();
  return res;
}
int main() {
  scanf("%d", &n);
  precalc();
  for (int(i) = 1; (i) <= n; i++) scanf("%d", &a[i]);
  for (int(i) = 1; (i) <= n - 1; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    edge[u].push_back(v);
    edge[v].push_back(u);
  }
  dfs(1, 0, 0);
  Lca::init();
  for (int(i) = 1; (i) <= n; i++) f[i] = calc(i);
  int ans = 0;
  for (int(i) = 1; (i) <= n; i++) {
    for (int(j) = 1; (j) <= n / i; j++) {
      if (mu[j] == 1)
        g[i] = Add(g[i], f[i * j]);
      else if (mu[j] == -1)
        g[i] = Sub(g[i], f[i * j]);
    }
    ans = Add(ans, Mul(Mul(inv[phi[i]], i), g[i]));
  }
  printf("%d\n", Mul(Mul(inv[n], inv[n - 1]), ans));
  return 0;
}
