#include <bits/stdc++.h>
using namespace std;
const int N = 400400, P = 1e9 + 7;
struct edge {
  int n, v;
} e[N << 1];
int n, u, v, S, T, fl, tot, tp, sum, ans, s1, s2, cnt;
int hd[N], a[N], w[N], p[N], fa[N], d[N], sz[N];
int we[N], top[N], df[N], ed[N], vi[N], su[N];
int pr[N], ck[N], fi[N], mu[N], h[N], st[N];
void add(int u, int v) {
  e[++fl] = (edge){hd[u], v};
  hd[u] = fl;
}
int qpw(int x, int y) {
  int z = 1;
  for (; y; y >>= 1, x = 1ll * x * x % P)
    if (y & 1) z = 1ll * z * x % P;
  return z;
}
void ini(int n) {
  fi[1] = mu[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (!ck[i]) pr[++tot] = i, fi[i] = i - 1, mu[i] = P - 1;
    for (int j = 1; j <= tot; j++) {
      if (i * pr[j] > n) break;
      ck[i * pr[j]] = 1;
      if (i % pr[j] == 0) {
        fi[i * pr[j]] = fi[i] * pr[j];
        break;
      }
      fi[i * pr[j]] = fi[i] * (pr[j] - 1);
      mu[i * pr[j]] = P - mu[i];
    }
  }
  for (int i = 1; i <= n; i++) {
    int tmp = 1ll * i * qpw(fi[i], P - 2) % P;
    for (int j = i; j <= n; j += i) (h[j] += 1ll * tmp * mu[j / i] % P) %= P;
  }
}
void dfs1(int u) {
  sz[u] = 1;
  for (int i = hd[u], v; v = e[i].v, i; i = e[i].n)
    if (v != fa[u]) {
      fa[v] = u, d[v] = d[u] + 1;
      dfs1(v);
      sz[u] += sz[v];
      if (sz[we[u]] < sz[v]) we[u] = v;
    }
}
void dfs2(int u, int TP) {
  top[u] = TP;
  df[u] = ++cnt;
  if (we[u]) dfs2(we[u], TP);
  for (int i = hd[u], v; v = e[i].v, i; i = e[i].n)
    if (v != fa[u] && v != we[u]) dfs2(v, v);
  ed[u] = cnt;
}
int lca(int u, int v) {
  for (; top[u] != top[v]; u = fa[top[u]])
    if (d[top[u]] < d[top[v]]) swap(u, v);
  return d[u] < d[v] ? u : v;
}
void dfs3(int u) {
  if (vi[u]) su[u] = fi[u], (sum += 1ll * fi[u] * fi[u] % P * d[u] % P) %= P;
  for (int i = hd[u], v; v = e[i].v, i; i = e[i].n)
    dfs3(v), (sum += 2ll * su[u] % P * su[v] % P * d[u] % P) %= P,
        (su[u] += su[v]) %= P;
}
bool cmp(int x, int y) { return df[x] < df[y]; }
void work(int x) {
  S = fl = sum = tp = s1 = s2 = 0;
  for (int i = x; i <= n; i += x)
    a[++S] = i, vi[i] = 1, (s1 += fi[i]) %= P,
    (s2 += 1ll * fi[i] * d[i] % P) %= P;
  sort(a + 1, a + S + 1, cmp);
  T = S;
  for (int i = 2; i <= T; i++) a[++S] = lca(a[i - 1], a[i]);
  sort(a + 1, a + S + 1, cmp);
  S = unique(a + 1, a + S + 1) - a - 1;
  for (int i = 1; i <= S; i++) hd[a[i]] = su[a[i]] = 0;
  for (int i = 1; i <= S; i++) {
    while (tp && ed[st[tp]] < df[a[i]]) tp--;
    if (tp) add(st[tp], a[i]);
    st[++tp] = a[i];
  }
  dfs3(a[1]);
  sum = (P - sum + 1ll * s1 * s2 % P) % P;
  (ans += 2ll * sum % P * h[x] % P) %= P;
  for (int i = 1; i <= S; i++) vi[a[i]] = 0;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &w[i]);
  for (int i = 2; i <= n; i++)
    scanf("%d%d", &u, &v), add(w[u], w[v]), add(w[v], w[u]);
  ini(n);
  dfs1(1);
  dfs2(1, 1);
  for (int i = 1; i <= n; i++) work(i);
  ans = 1ll * ans * qpw(1ll * n * (n - 1) % P, P - 2) % P;
  printf("%d\n", ans);
}
