#include <bits/stdc++.h>
using namespace std;
int vis[400005], phi[400005], mu[400005], P[400005];
int add(int a, int b) {
  a += b;
  return a >= 1000000007 ? a - 1000000007 : a;
}
int ksm(int a, int b) {
  int s = 1;
  for (; b; b >>= 1, a = 1ll * a * a % 1000000007)
    if (b & 1) s = 1ll * s * a % 1000000007;
  return s;
}
void Euler() {
  phi[1] = mu[1] = 1;
  for (int i = 2; i < 400005; i++) {
    if (!vis[i]) P[++P[0]] = i, phi[i] = i - 1, mu[i] = 1000000007 - 1;
    for (int j = 1, t; j <= P[0] && (t = P[j] * i) < 400005; j++) {
      vis[t] = 1;
      if (i % P[j] == 0) {
        phi[t] = phi[i] * P[j];
        break;
      }
      phi[t] = phi[i] * (P[j] - 1);
      mu[t] = (1000000007 - mu[i]) % 1000000007;
    }
  }
}
int n, w[400005];
int pre[400005], to[400005], las[400005], inc;
void ins(int a, int b) {
  pre[++inc] = las[a];
  las[a] = inc, to[inc] = b;
}
int fa[400005][21], dep[400005], in[400005], out[400005];
void dfs(int x, int f) {
  in[x] = ++in[0], dep[x] = dep[f] + 1;
  fa[x][0] = f;
  for (int i = 1; i <= 20; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1];
  for (int i = las[x]; i; i = pre[i])
    if (to[i] != f) dfs(to[i], x);
  out[x] = in[0];
}
int LCA(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 20, d = dep[x] - dep[y]; i >= 0; i--)
    if (d >> i & 1) x = fa[x][i];
  if (x == y) return x;
  for (int i = 20; i >= 0; i--)
    if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}
vector<int> T[400005];
int A[400005], st[400005], val[400005], tp, ans;
int cmp(int a, int b) { return in[a] < in[b]; }
int sum[400005], flag[400005];
void dp(int x) {
  sum[x] = phi[w[x]] * flag[x];
  if (flag[x])
    ans = add(ans,
              1ll * phi[w[x]] * phi[w[x]] % 1000000007 * dep[x] % 1000000007);
  for (int i = 0; i < T[x].size(); i++) {
    int y = T[x][i];
    dp(y);
    ans = add(ans, 2ll * sum[x] * sum[y] % 1000000007 * dep[x] % 1000000007);
    sum[x] = add(sum[x], sum[y]);
  }
}
int Solve() {
  sort(A + 1, A + A[0] + 1, cmp);
  int s1 = 0, s2 = 0;
  for (int i = 1; i <= A[0]; i++) {
    if (i != A[0]) A[A[0] + i] = LCA(A[i], A[i + 1]);
    flag[A[i]] = 1;
    s1 = add(s1, phi[w[A[i]]]),
    s2 = add(s2, 1ll * dep[A[i]] * phi[w[A[i]]] % 1000000007);
  }
  A[0] += A[0] - 1;
  sort(A + 1, A + A[0] + 1, cmp);
  A[0] = unique(A + 1, A + A[0] + 1) - A - 1;
  tp = 0;
  for (int i = 1; i <= A[0]; i++) {
    T[A[i]].clear();
    while (tp && !(in[st[tp]] <= in[A[i]] && out[A[i]] <= out[st[tp]])) tp--;
    if (tp) T[st[tp]].push_back(A[i]);
    st[++tp] = A[i];
  }
  ans = 0, dp(st[1]);
  for (int i = 1; i <= A[0]; i++) flag[A[i]] = 0;
  A[0] = 0;
  return add(2ll * s1 * s2 % 1000000007, 1000000007 - add(ans, ans));
}
int res[400005], g[400005];
int main() {
  Euler();
  scanf("%d", &n);
  for (int i = 1, x; i <= n; i++) scanf("%d", &x), val[x] = i, w[i] = x;
  for (int i = 1, u, v; i < n; i++) scanf("%d%d", &u, &v), ins(u, v), ins(v, u);
  dfs(1, 0);
  for (int i = 1; i <= n; i++) {
    int pp = 1ll * i * ksm(phi[i], 1000000007 - 2) % 1000000007;
    for (int j = i; j <= n;
         g[j] = add(g[j], 1ll * mu[j / i] * pp % 1000000007), j += i)
      if (val[j]) A[++A[0]] = val[j];
    res[i] = Solve();
  }
  int s = 0;
  for (int i = 1; i <= n; i++) s = add(s, 1ll * res[i] * g[i] % 1000000007);
  printf("%d\n", 1ll * s * ksm(n, 1000000007 - 2) % 1000000007 *
                     ksm(n - 1, 1000000007 - 2) % 1000000007);
  return 0;
}
