#include <bits/stdc++.h>
using std::sort;
using std::swap;
using std::vector;
int getch() {
  static const int len = 1 << 20;
  static char buf[len], *st, *ed;
  if (st == ed) ed = buf + fread(st = buf, 1, len, stdin);
  return st == ed ? EOF : *st++;
}
template <typename T>
void read(T& x) {
  static int c;
  x = 0, c = getch();
  while (isspace(c)) c = getch();
  while (isdigit(c)) x = x * 10 + c - '0', c = getch();
  return;
}
template <typename T, typename... Args>
void read(T& x, Args&... args) {
  return read(x), read(args...);
}
const int maxn = 2e5 + 2, mod = 1e9 + 7;
vector<int> edge[maxn];
int n, m, val[maxn], pos[maxn], ans, mu[maxn], phi[maxn], sum[maxn],
    fa[maxn][22], dep[maxn], _dfn[maxn << 1], *dfn = _dfn + maxn, cnt, to[maxn],
                                              nxt[maxn], hd[maxn], curVal[maxn],
                                              phiSum[maxn];
void init() {
  static int cnt, prime[maxn], vis[maxn], inv[maxn];
  mu[1] = phi[1] = vis[1] = inv[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (!vis[i]) prime[++cnt] = i, mu[i] = -1, phi[i] = i - 1;
    for (int j = 1; j <= cnt && i * prime[j] <= n; j++) {
      vis[i * prime[j]] = 1;
      if (i % prime[j] == 0) {
        mu[i * prime[j]] = 0, phi[i * prime[j]] = phi[i] * prime[j];
        break;
      }
      mu[i * prime[j]] = -mu[i], phi[i * prime[j]] = phi[i] * phi[prime[j]];
    }
  }
  for (int i = 2; i <= n; i++)
    mu[i] = (mu[i] + mod) % mod,
    inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
  for (int i = 1; i <= n; i++)
    for (int j = 1; i * j <= n; j++)
      (sum[i * j] += 1ll * i * inv[phi[i]] % mod * mu[j] % mod) %= mod;
  m = 1ll * inv[n] * inv[n - 1] % mod;
  return;
}
void dfs(int u) {
  static int cnt;
  dfn[u] = ++cnt, dep[u] = dep[fa[u][0]] + 1;
  for (int i = 1; i <= 20; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
  for (int v : edge[u])
    if (fa[u][0] != v) fa[v][0] = u, dfs(v);
  dfn[-u] = ++cnt;
  return;
}
int lca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  for (int i = 20; ~i; i--)
    if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];
  if (u == v) return v;
  for (int i = 20; ~i; i--)
    if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
  return fa[u][0];
}
void add(int x, int y) {
  to[++cnt] = y, nxt[cnt] = hd[x], hd[x] = cnt;
  return;
}
int calc(int x) {
  phiSum[x] = phi[curVal[x]];
  int sonSum = 0, ownSum = 1ll * phiSum[x] * phiSum[x] % mod;
  for (int i = hd[x]; i; i = nxt[i])
    (sonSum += calc(to[i])) %= mod,
        (ownSum += 2ll * phiSum[x] * phiSum[to[i]] % mod) %= mod,
        (phiSum[x] += phiSum[to[i]]) %= mod;
  return (1ll * ownSum * dep[x] + sonSum) % mod;
}
int solve(int x) {
  static int curLca, curAns, sumPhi, sumPhiDep, cntPos, arrPos[maxn << 1],
      visPos[maxn], stkPos[maxn], *topPos = stkPos;
  for (int i = x; i <= n; i += x)
    arrPos[++cntPos] = pos[i], visPos[pos[i]] = 1, curVal[pos[i]] = i,
    (sumPhi += phi[i]) %= mod,
    (sumPhiDep += 1ll * phi[i] * dep[pos[i]] % mod) %= mod;
  sort(arrPos + 1, arrPos + cntPos + 1,
       [](int x, int y) -> bool { return dfn[x] < dfn[y]; });
  for (int i = 1, j = cntPos; i < j; i++)
    if (!visPos[curLca = lca(arrPos[i], arrPos[i + 1])])
      visPos[curLca] = 1, arrPos[++cntPos] = curLca;
  if (!visPos[1]) visPos[1] = 1, arrPos[++cntPos] = 1;
  for (int i = 1, j = cntPos; i <= j; i++) arrPos[++cntPos] = -arrPos[i];
  sort(arrPos + 1, arrPos + cntPos + 1,
       [](int x, int y) -> bool { return dfn[x] < dfn[y]; });
  for (int i = 1, j = cntPos; i <= j; i++)
    if (arrPos[i] > 0)
      if (topPos != stkPos)
        add(*topPos, arrPos[i]), *++topPos = arrPos[i];
      else
        *++topPos = arrPos[i];
    else
      visPos[*topPos--] = 0;
  curAns = (2ll * sumPhi * sumPhiDep % mod + mod - 2ll * calc(1) % mod) % mod,
  sumPhi = sumPhiDep = cnt = 0;
  for (int i = 1, j = cntPos; i <= j; i++)
    if (arrPos[i] > 0)
      curVal[arrPos[i]] = hd[arrPos[i]] = 0, --cntPos;
    else
      --cntPos;
  return curAns;
}
int main() {
  read(n);
  for (int i = 1; i <= n; i++) read(val[i]), pos[val[i]] = i;
  for (int i = 1, u, v; i < n; i++)
    read(u, v), edge[u].push_back(v), edge[v].push_back(u);
  init(), dfs(1);
  for (int i = 1; i <= n; i++) (ans += 1ll * solve(i) * sum[i] % mod) %= mod;
  ans = 1ll * ans * m % mod, printf("%d\n", ans);
  return 0;
}
