#include <bits/stdc++.h>
using namespace std;
const int Maxn = 200005, mod = 1e9 + 7;
int phi[Maxn], mu[Maxn], g[Maxn], G[Maxn];
int h[Maxn], a[Maxn], id[Maxn], dep[Maxn], dfn[Maxn], vis[Maxn];
int f[Maxn][20], cnt, n;
struct node {
  int to, next;
} e[Maxn * 2];
void AddEdge(int x, int y) {
  if (x == y) return;
  e[++cnt] = (node){y, h[x]};
  h[x] = cnt;
}
long long ksm(long long x, long long k) {
  long long ret = 1, tmp = x;
  while (k) {
    if (k & 1) ret = ret * tmp % mod;
    tmp = tmp * tmp % mod;
    k >>= 1;
  }
  return ret;
}
long long inv(long long x) { return ksm(x, mod - 2); }
void Init() {
  static bool Prime[Maxn];
  static int P[Maxn];
  phi[1] = 1;
  mu[1] = 1;
  for (int i = 2; i < Maxn; i++) {
    if (!Prime[i]) P[++P[0]] = i, phi[i] = i - 1, mu[i] = -1;
    for (int j = 1; j <= P[0] && i * P[j] < Maxn; j++) {
      Prime[i * P[j]] = 1;
      if (i % P[j])
        phi[i * P[j]] = phi[i] * phi[P[j]], mu[i * P[j]] = -mu[i];
      else {
        phi[i * P[j]] = phi[i] * P[j];
        mu[i * P[j]] = 0;
        break;
      }
    }
  }
}
void dfs1(int x, int fa) {
  static int cnt;
  dfn[x] = ++cnt;
  dep[x] = dep[f[x][0] = fa] + 1;
  for (int i = 1; i < 20; i++) f[x][i] = f[f[x][i - 1]][i - 1];
  for (int& p = h[x]; p; p = e[p].next) {
    int y = e[p].to;
    if (y == fa) continue;
    dfs1(y, x);
  }
}
int LCA(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 19; ~i; i--)
    if (dep[f[x][i]] >= dep[y]) x = f[x][i];
  if (x == y) return x;
  for (int i = 19; ~i; i--)
    if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
  return f[x][0];
}
pair<long long, long long> dfs(int x) {
  long long ret1 = 0, ret2 = 0, sum = vis[x] ? phi[a[x]] : 0;
  for (int& p = h[x]; p; p = e[p].next) {
    int y = e[p].to;
    auto T = dfs(y);
    ret1 = (ret1 + T.first) % mod;
    ret2 = (ret2 + 2 * sum * T.second) % mod;
    sum = (sum + T.second) % mod;
  }
  if (vis[x]) ret2 = (ret2 + 1ll * phi[a[x]] * phi[a[x]]) % mod;
  ret2 = -2 * ret2 * dep[x] % mod;
  ret2 = (ret2 % mod + mod) % mod;
  return {(ret1 + ret2) % mod, sum};
}
long long solve(int x) {
  static int p[Maxn], Stack[Maxn], top, k;
  k = n / x;
  cnt = 0;
  for (int i = 1; i <= k; i++) p[i] = id[i * x], vis[p[i]] = true;
  sort(p + 1, p + k + 1, [](int a, int b) { return dfn[a] < dfn[b]; });
  Stack[top = 1] = 1;
  for (int i = 1; i <= k; i++) {
    int now = p[i], lca = LCA(Stack[top], now);
    while (dep[lca] < dep[Stack[top - 1]])
      AddEdge(Stack[top - 1], Stack[top]), top--;
    AddEdge(lca, Stack[top--]);
    if (lca != Stack[top]) Stack[++top] = lca;
    if (now != Stack[top]) Stack[++top] = now;
  }
  while (top--) AddEdge(Stack[top], Stack[top + 1]);
  long long ret = 0, sum = 0;
  for (int i = 1; i <= k; i++) sum = (sum + phi[a[p[i]]]) % mod;
  for (int i = 1; i <= k; i++)
    ret = (ret + dep[p[i]] * (sum) % mod * phi[a[p[i]]]) % mod;
  ret = (2 * ret + dfs(0).first) % mod;
  for (int i = 1; i <= k; i++) vis[p[i]] = false;
  return ret;
}
int main() {
  Init();
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) id[a[i]] = i;
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    AddEdge(x, y);
    AddEdge(y, x);
  }
  dfs1(1, 0);
  for (int i = 1; i <= n; i++) g[i] = solve(i);
  for (int i = 1; i <= n; i++)
    for (int j = i; j <= n; j += i)
      G[i] = ((G[i] + 1ll * mu[j / i] * g[j]) % mod + mod) % mod;
  long long Ans = 0;
  for (int d = 1; d <= n; d++)
    Ans = (Ans + d * inv(phi[d]) % mod * G[d] % mod) % mod;
  cout << Ans * inv(n) % mod * inv(n - 1) % mod << "\n";
  return 0;
}
