#include <bits/stdc++.h>
const int mod = 1e9 + 7;
const int maxn = 2e5 + 5;
int n, mu[maxn], phi[maxn], ai[maxn], head[maxn], E[maxn << 1 | 1];
int backAi[maxn], V[maxn << 1 | 1], cnt, deep[maxn], top[maxn];
int f[maxn], lar[maxn], size[maxn], li[maxn], ri[maxn], seq[maxn];
int num, pi[maxn], nump, stack[maxn], Top, W[maxn << 1 | 1];
long long G[maxn], g[maxn], F[maxn], ans, sum;
bool vis[maxn];
inline void read(int &now) {
  char Cget;
  now = 0;
  while (!isdigit(Cget = getchar()))
    ;
  while (isdigit(Cget)) {
    now = now * 10 + Cget - '0';
    Cget = getchar();
  }
}
void dfs1(int now, int fa) {
  f[now] = fa;
  size[now] = 1;
  deep[now] = deep[fa] + 1;
  for (int i = head[now]; i != 0; i = E[i])
    if (V[i] != fa) {
      dfs1(V[i], now);
      size[now] += size[V[i]];
      if (size[V[i]] >= size[lar[now]]) lar[now] = V[i];
    }
}
void dfs2(int now, int chain) {
  li[now] = ++cnt;
  top[now] = chain;
  if (lar[now]) dfs2(lar[now], chain);
  for (int i = head[now]; i != 0; i = E[i])
    if (V[i] != f[now] && V[i] != lar[now]) dfs2(V[i], V[i]);
  ri[now] = cnt;
}
inline int getLca(int x, int y) {
  while (top[x] != top[y])
    if (deep[top[x]] > deep[top[y]])
      x = f[top[x]];
    else
      y = f[top[y]];
  if (deep[x] < deep[y]) return x;
  return y;
}
void pre(int lit) {
  mu[1] = 1;
  phi[1] = 1;
  for (int i = 2; i <= lit; i++) {
    if (!vis[i]) {
      mu[i] = -1;
      phi[i] = i - 1;
      pi[++nump] = i;
    }
    for (int v = 1; v <= nump && pi[v] * i <= lit; v++) {
      vis[i * pi[v]] = true;
      if (i % pi[v] == 0) {
        phi[i * pi[v]] = phi[i] * pi[v];
        break;
      }
      mu[i * pi[v]] = -mu[i];
      phi[i * pi[v]] = phi[i] * (pi[v] - 1);
    }
  }
}
inline bool compare(const int &x, const int &y) { return li[x] < li[y]; }
inline void edge_add(int u, int v, int w = 0) {
  E[++cnt] = head[u];
  V[cnt] = v;
  W[cnt] = w;
  head[u] = cnt;
  E[++cnt] = head[v];
  V[cnt] = u;
  W[cnt] = w;
  head[v] = cnt;
}
void dfs(int now, int fa, int dis);
void clear(int now, int fa) {
  for (int i = head[now]; i != 0; i = E[i])
    if (V[i] != fa) clear(V[i], now);
  vis[now] = false;
  G[now] = 0;
  head[now] = 0;
}
void solve() {
  cnt = 0;
  stack[Top = 1] = 1;
  for (int i = 2; i <= num; i++) {
    int now = seq[i], pos = 0;
    if (stack[Top] == now) continue;
    while (li[now] < li[stack[Top]] || li[now] > ri[stack[Top]]) {
      if (pos) edge_add(pos, stack[Top]);
      pos = stack[Top--];
    }
    if (pos) {
      int lca = getLca(pos, now);
      if (lca != pos) edge_add(pos, lca);
      if (lca != stack[Top]) stack[++Top] = lca;
    }
    stack[++Top] = now;
  }
  while (Top > 1) {
    edge_add(stack[Top], stack[Top - 1]);
    Top--;
  }
  ans = 0;
  sum = 0;
  for (int i = 1; i <= num; i++) {
    if (vis[seq[i]]) (sum += phi[ai[seq[i]]]) %= mod;
    G[seq[i]] = 0;
  }
  dfs(1, 0, 0);
  clear(1, 0);
  cnt = 0;
}
void dfs(int now, int fa, int dis) {
  dis = deep[now];
  if (vis[now]) {
    (ans += 1LL * phi[ai[now]] * (sum - phi[ai[now]]) % mod * dis % mod) %= mod;
    (G[now] += phi[ai[now]]) %= mod;
  }
  for (int i = head[now]; i != 0; i = E[i])
    if (V[i] != fa) {
      dfs(V[i], now, dis + W[i]);
      (ans -= 1LL * G[now] * G[V[i]] % mod * dis * 2 % mod) %= mod;
      (G[now] += G[V[i]]) %= mod;
    }
}
inline long long poww(long long x, long long e) {
  long long res = 1;
  while (e > 0) {
    if (e & 1) (res *= x) %= mod;
    e >>= 1;
    (x *= x) %= mod;
  }
  return res;
}
int main() {
  read(n);
  pre(n);
  for (int i = 1; i <= n; i++) {
    read(ai[i]);
    backAi[ai[i]] = i;
  }
  for (int i = 1, u, v; i < n; i++) {
    read(u);
    read(v);
    edge_add(u, v);
  }
  cnt = 0;
  dfs1(1, 0);
  dfs2(1, 1);
  memset(vis, 0, sizeof(vis));
  memset(head, 0, sizeof(head));
  for (int i = 1; i <= n; i++) {
    num = 0;
    for (int v = 1; v * i <= n; v++) {
      seq[++num] = backAi[i * v];
      vis[seq[num]] = true;
    }
    if (!vis[1]) seq[++num] = 1;
    std::sort(seq + 1, seq + num + 1, compare);
    solve();
    g[i] = ans * 2 % mod;
  }
  for (int i = 1; i <= n; i++) {
    for (int v = 1; v * i <= n; v++) (F[i] += g[i * v] * mu[v]) %= mod;
    (F[i] *= i) %= mod;
    (F[i] *= poww(phi[i], mod - 2)) %= mod;
  }
  ans = 0;
  for (int i = 1; i <= n; i++) ans = (ans + F[i]) % mod;
  (ans *= poww(n, mod - 2)) %= mod;
  (ans *= poww(n - 1, mod - 2)) %= mod;
  std::cout << (ans + mod) % mod;
  return 0;
}
