#include <bits/stdc++.h>
using namespace std;
const int MAXN = 400005;
const int MOD = 1e9 + 7;
int n, a[MAXN];
int pri[MAXN], pri_tot, phi[MAXN];
bool bk[MAXN];
int et, fir[MAXN], to[MAXN], ne[MAXN];
int clk, dfn[MAXN], fa[MAXN], siz[MAXN], dep[MAXN], son[MAXN], bel[MAXN];
int ord[MAXN], tot, sta[MAXN], top;
int f[MAXN], ans;
void shake() {
  phi[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (!bk[i]) phi[pri[++pri_tot] = i] = i - 1;
    for (int j = 1; i * pri[j] <= n; j++) {
      bk[i * pri[j]] = 1;
      if (!(i % pri[j])) {
        phi[i * pri[j]] = phi[i] * pri[j];
        break;
      }
      phi[i * pri[j]] = phi[i] * (pri[j] - 1);
    }
  }
}
void link(int u, int v) { to[++et] = v, ne[et] = fir[u], fir[u] = et; }
void dfs_init(int o) {
  dep[o] = dep[fa[o]] + (siz[o] = 1);
  for (int i = fir[o], t; i; i = ne[i])
    if ((t = to[i]) != fa[o]) {
      fa[t] = o, dfs_init(t);
      siz[o] += siz[t];
      if (siz[t] > siz[son[o]]) son[o] = t;
    }
}
void dfs_init(int o, int b) {
  bel[o] = b, dfn[o] = ++clk;
  if (son[o]) dfs_init(son[o], b);
  for (int i = fir[o]; i; i = ne[i])
    if (to[i] != fa[o] && to[i] != son[o]) dfs_init(to[i], to[i]);
}
bool cmp(int x, int y) { return dfn[x] < dfn[y]; }
namespace imag {
int et, fir[MAXN], to[MAXN], ne[MAXN], len[MAXN];
int S[MAXN], val[MAXN];
int ans;
void link(int u, int v, int x) {
  to[++et] = v, ne[et] = fir[u], fir[u] = et;
  to[++et] = u, ne[et] = fir[v], fir[v] = et;
  len[et - 1] = len[et] = x;
}
int dfs_init(int o, int fa, int d) {
  int res = 1ll * d * (S[o] = val[o]) % MOD;
  for (int i = fir[o], t; i; i = ne[i])
    if ((t = to[i]) != fa) {
      res = (res + dfs_init(t, o, d + len[i])) % MOD;
      S[o] = (S[o] + S[t]) % MOD;
    }
  return res;
}
void dfs(int o, int fa, int sum) {
  if (val[o]) ans = (ans + 1ll * val[o] * sum) % MOD;
  for (int i = fir[o]; i; i = ne[i])
    if (to[i] != fa)
      dfs(to[i], o,
          (sum + 1ll * len[i] * (S[1] - 2ll * S[to[i]] + MOD * 2)) % MOD);
}
void dfs_clear(int o, int fa) {
  for (int i = fir[o]; i; i = ne[i])
    if (to[i] != fa) dfs_clear(to[i], o);
  val[o] = S[o] = fir[o] = 0;
}
int work() {
  ans = 0, dfs(1, 0, dfs_init(1, 0, 0));
  dfs_clear(1, 0), et = 0;
  return ans;
}
}  // namespace imag
int get_lca(int x, int y) {
  while (bel[x] != bel[y])
    dep[bel[x]] > dep[bel[y]] ? x = fa[bel[x]] : y = fa[bel[y]];
  return dep[x] < dep[y] ? x : y;
}
int solve(int g) {
  tot = 0, sta[top = 1] = 1;
  for (int i = g; i <= n; i += g) ord[++tot] = a[i];
  sort(ord + 1, ord + tot + 1, cmp);
  for (int i = ord[1] == 1 ? 2 : 1, lca = 0; i <= tot; i++, lca = 0) {
    while (top) {
      lca = get_lca(ord[i], sta[top]);
      if (top > 1 && dep[lca] < dep[sta[top - 1]])
        imag::link(sta[top - 1], sta[top], dep[sta[top]] - dep[sta[top - 1]]),
            top--;
      else {
        if (dep[lca] < dep[sta[top]])
          imag::link(lca, sta[top], dep[sta[top]] - dep[lca]), top--;
        break;
      }
    }
    if (sta[top] != lca) sta[++top] = lca;
    sta[++top] = ord[i];
  }
  while (top > 1)
    imag::link(sta[top - 1], sta[top], dep[sta[top]] - dep[sta[top - 1]]),
        top--;
  for (int i = g; i <= n; i += g) imag::val[a[i]] = phi[i];
  return imag::work();
}
int calc_inv(int a) {
  int x = MOD - 2, res = 1;
  while (x) {
    if (x & 1) res = 1ll * res * a % MOD;
    a = 1ll * a * a % MOD, x >>= 1;
  }
  return res;
}
int main() {
  scanf("%d", &n), shake();
  for (int i = 1, x; i <= n; i++) scanf("%d", &x), a[x] = i;
  for (int i = 1, x, y; i < n; i++) {
    scanf("%d %d", &x, &y);
    link(x, y), link(y, x);
  }
  dfs_init(1), dfs_init(1, 1);
  for (int g = n; g; g--) {
    f[g] = solve(g);
    for (int i = g << 1; i <= n; i += g) f[g] = (f[g] - f[i] + MOD) % MOD;
    ans = (ans + 1ll * g * calc_inv(phi[g]) % MOD * f[g]) % MOD;
  }
  printf("%I64d", 1ll * ans * calc_inv(n) % MOD * calc_inv(n - 1) % MOD);
  return 0;
}
