#include <bits/stdc++.h>
using namespace std;
const int N = 200005, P = 1e9 + 7;
int n, ans, T, cc, cnt, tp, a[N], b[N], hd[N], st[N], f[N], p[N], q[N], dep[N],
    fa[N][20], tl[N], tr[N], s1[N], s2[N], phi[N] = {0, 1}, vis[N] = {1, 1};
struct E {
  int v, nxt;
} e[N << 1];
inline void add(int u, int v) {
  e[++cc] = (E){v, hd[u]};
  hd[u] = cc;
}
inline int pw(int a, int b) {
  int r = 1;
  for (; b; b >>= 1, a = 1ll * a * a % P)
    if (b & 1) r = 1ll * r * a % P;
  return r;
}
inline bool cmp(int x, int y) { return tl[x] < tl[y]; }
void dfs(int x) {
  tl[x] = ++T;
  for (int i = 1; i < 18; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1];
  for (int i = hd[x]; i; i = e[i].nxt)
    if (e[i].v != fa[x][0])
      fa[e[i].v][0] = x, dep[e[i].v] = dep[x] + 1, dfs(e[i].v);
  tr[x] = T;
}
inline int lca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  int sub = dep[u] - dep[v];
  for (int i = 17; i >= 0; i--)
    if (sub >> i & 1) u = fa[u][i];
  if (u == v) return u;
  for (int i = 17; i >= 0; i--)
    if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
  return fa[u][0];
}
inline void upd(int u, int v) {
  int s = (s1[u] + 1ll * (dep[u] - dep[v]) * s2[u]) % P;
  ans = (ans + 1ll * s * s2[v] + 1ll * s2[u] * s1[v]) % P;
  s1[v] = (s1[v] + s) % P;
  s2[v] = (s2[v] + s2[u]) % P;
}
int sol(int d) {
  cnt = tp = ans = 0;
  for (int j = d; j <= n; j += d) q[++cnt] = b[j];
  sort(q + 1, q + cnt + 1, cmp);
  int rt = lca(q[1], q[cnt]);
  if (rt != q[1]) {
    st[++tp] = rt;
    s1[rt] = s2[rt] = 0;
  }
  for (int i = 1; i <= cnt; i++) {
    if (i != 1) {
      int t = lca(q[i], q[i - 1]);
      for (; dep[st[tp]] > dep[t];)
        if (dep[st[tp - 1]] < dep[t]) {
          s1[t] = s2[t] = 0;
          upd(st[tp], t);
          st[tp] = t;
        } else {
          upd(st[tp], st[tp - 1]);
          tp--;
        }
    }
    st[++tp] = q[i];
    s1[q[i]] = 0;
    s1[q[i]] = 0;
    s2[q[i]] = phi[a[q[i]]];
  }
  while (tp > 1) {
    upd(st[tp], st[tp - 1]);
    tp--;
  }
  return ans * 2 % P;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[a[i]] = i;
  for (int i = 1, u, v; i < n; i++) scanf("%d%d", &u, &v), add(u, v), add(v, u);
  for (int i = 2; i <= n; i++) {
    if (!vis[i]) p[++p[0]] = i, phi[i] = i - 1;
    for (int j = 1; j <= p[0] && i * p[j] <= n; j++) {
      vis[i * p[j]] = 1;
      if (i % p[j])
        phi[i * p[j]] = phi[i] * (p[j] - 1);
      else {
        phi[i * p[j]] = phi[i] * p[j];
        break;
      }
    }
  }
  dep[1] = 1;
  dfs(1);
  for (int i = 1; i <= n; i++) f[i] = sol(i);
  for (int i = n; i >= 1; i--)
    for (int j = i + i; j <= n; j += i) f[i] = (f[i] - f[j] + P) % P;
  int res = 0;
  for (int i = 1; i <= n; i++)
    res = (res + 1ll * f[i] * i % P * pw(phi[i], P - 2)) % P;
  printf("%d\n", 1ll * res * pw(n, P - 2) % P * pw(n - 1, P - 2) % P);
  return 0;
}
