#include <bits/stdc++.h>
using namespace std;
inline long long getint() {
  long long num = 0, flag = 1;
  char c;
  while ((c = getchar()) < '0' || c > '9')
    if (c == '-') flag = -1;
  while (c >= '0' && c <= '9') num = num * 10 + c - 48, c = getchar();
  return num * flag;
}
int n;
int a[400005], id[400005], pos[400005], cur;
int F[400005];
int pri[400005], phi[400005], mu[400005], np[400005], pcnt;
int fir[400005], nxt[400005], to[400005], cnt;
int sz[400005], son[400005], dpt[400005], fa[400005], tp[400005];
vector<int> G[400005];
int p[400005], stk[400005], top;
int sum[400005], f[400005], vis[400005];
int ans;
int ksm(int num, int k) {
  int ret = 1;
  for (; k; k >>= 1, num = 1ll * num * num % 1000000007)
    if (k & 1) ret = 1ll * ret * num % 1000000007;
  return ret;
}
void newnode(int u, int v) { to[++cnt] = v, nxt[cnt] = fir[u], fir[u] = cnt; }
int upd(int x) { return x < 1000000007 ? x : x - 1000000007; }
bool cmp(int x, int y) { return pos[x] < pos[y]; }
void init() {
  mu[1] = phi[1] = 1;
  for (int i = 2; i < 400005; i++) {
    if (!np[i]) pri[++pcnt] = i, phi[i] = i - 1, mu[i] = 1000000007 - 1;
    for (int j = 1; j <= pcnt && i * pri[j] < 400005; j++) {
      np[i * pri[j]] = 1;
      if (i % pri[j])
        phi[i * pri[j]] = phi[i] * (pri[j] - 1),
                mu[i * pri[j]] = 1000000007 - mu[i];
      else {
        phi[i * pri[j]] = phi[i] * pri[j];
        break;
      }
    }
  }
}
void dfs1(int u) {
  sz[u] = 1;
  pos[u] = ++cur;
  for (int i = fir[u]; i; i = nxt[i])
    if (to[i] != fa[u]) {
      fa[to[i]] = u, dpt[to[i]] = dpt[u] + 1;
      dfs1(to[i]), sz[u] += sz[to[i]];
      if (sz[son[u]] < sz[to[i]]) son[u] = to[i];
    }
}
void dfs2(int u, int ac) {
  tp[u] = ac;
  if (son[u]) dfs2(son[u], ac);
  for (int i = fir[u]; i; i = nxt[i])
    if (to[i] != fa[u] && to[i] != son[u]) dfs2(to[i], to[i]);
}
int LCA(int u, int v) {
  for (; tp[u] != tp[v]; u = fa[tp[u]])
    if (dpt[tp[u]] < dpt[tp[v]]) swap(u, v);
  return dpt[u] < dpt[v] ? u : v;
}
void dp(int u) {
  sum[u] = vis[u] * phi[a[u]];
  for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i];
    dp(v), f[u] = upd(f[u] + 2ll * sum[u] * sum[v] % 1000000007),
           sum[u] = upd(sum[u] + sum[v]);
  }
}
inline void solve(int x) {
  int tot = 0;
  for (int i = x; i <= n; i += x) p[++tot] = id[i], vis[id[i]] = 1;
  sort(p + 1, p + tot + 1, cmp);
  for (int i = tot - 1; i; i--) p[++tot] = LCA(p[i], p[i + 1]);
  sort(p + 1, p + tot + 1, cmp);
  tot = unique(p + 1, p + tot + 1) - p - 1;
  stk[++top] = p[1];
  for (int i = 2; i <= tot; i++) {
    while (top && pos[stk[top]] + sz[stk[top]] <= pos[p[i]]) top--;
    G[stk[top]].push_back(p[i]), stk[++top] = p[i];
  }
  top = 0;
  int tmp1 = 0, tmp2 = 0;
  for (int i = 1; i <= tot; i++)
    if (vis[p[i]]) tmp2 = upd(tmp2 + phi[a[p[i]]]);
  for (int i = 1; i <= tot; i++)
    if (vis[p[i]])
      tmp1 = upd(tmp1 + 1ll * phi[a[p[i]]] * dpt[p[i]] % 1000000007 * tmp2 %
                            1000000007);
  dp(p[1]);
  tmp2 = 0;
  for (int i = 1; i <= tot; i++)
    tmp2 = upd(tmp2 + 1ll * dpt[p[i]] * f[p[i]] % 1000000007);
  for (int i = 1; i <= tot; i++)
    if (vis[p[i]])
      tmp2 = upd(tmp2 + 1ll * dpt[p[i]] * phi[a[p[i]]] % 1000000007 *
                            phi[a[p[i]]] % 1000000007);
  F[x] = upd(upd(tmp1 * 2) - upd(tmp2 * 2) + 1000000007);
  for (int i = 1; i <= tot; i++)
    G[p[i]].clear(), f[p[i]] = sum[p[i]] = vis[p[i]] = 0;
}
int main() {
  init();
  n = getint();
  for (int i = 1; i <= n; i++) id[a[i] = getint()] = i;
  for (int i = 1; i < n; i++) {
    int u = getint(), v = getint();
    newnode(u, v), newnode(v, u);
  }
  dfs1(1), dfs2(1, 1);
  for (int i = 1; i <= n / 2; i++) solve(i);
  for (int i = 1; i <= n; i++)
    for (int j = i; j <= n; j += i)
      f[i] = upd(f[i] + 1ll * F[j] * mu[j / i] % 1000000007);
  for (int i = 1; i <= n; i++)
    ans = upd(ans + 1ll * ksm(phi[i], 1000000007 - 2) * i % 1000000007 * f[i] %
                        1000000007);
  printf("%lld\n", 1ll * ans *
                       ksm(1ll * n * (n - 1) % 1000000007, 1000000007 - 2) %
                       1000000007);
}
