#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int N = 2e5 + 5;
inline int read() {
  int x(0);
  char c;
  while (!isdigit(c = getchar()))
    ;
  do x = (x << 1) + (x << 3) + c - 48;
  while (isdigit(c = getchar()));
  return x;
}
long long fastpow(long long a, long long b) {
  if (!b) return 1ll;
  long long t = fastpow(a, b / 2);
  if (b & 1)
    return t * t % mod * a % mod;
  else
    return t * t % mod;
}
long long inv(long long x) { return fastpow(x % mod, mod - 2); }
int p[N], tot = 0;
bool flag[N];
int mu[N], phi[N];
void sieve(int n) {
  mu[1] = phi[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (!flag[i]) mu[i] = -1, phi[i] = i - 1, p[++tot] = i;
    for (int j = 1; j <= tot && i * p[j] <= n; j++) {
      flag[i * p[j]] = 1;
      if (i % p[j] == 0) {
        mu[i * p[j]] = 0, phi[i * p[j]] = phi[i] * p[j];
        break;
      }
      mu[i * p[j]] = -mu[i], phi[i * p[j]] = phi[i] * (p[j] - 1);
    }
  }
}
int n, a[N], loc[N];
vector<int> adj[N];
long long f[N], g[N];
int fa[N], siz[N], dep[N];
int wson[N], wtop[N];
int dfn[N], timer = 0;
void dfs1(int x, int f) {
  dep[x] = dep[fa[x] = f] + 1, siz[x] = 1;
  for (auto y : adj[x])
    if (y != f) {
      dfs1(y, x), siz[x] += siz[y];
      if (siz[wson[x]] < siz[y]) wson[x] = y;
    }
}
void dfs2(int x, int t) {
  wtop[x] = t, dfn[x] = ++timer;
  if (wson[x]) dfs2(wson[x], t);
  for (auto y : adj[x])
    if (y != fa[x] && y != wson[x]) dfs2(y, y);
}
int lca(int x, int y) {
  while (wtop[x] != wtop[y]) {
    if (dep[wtop[x]] < dep[wtop[y]]) swap(x, y);
    x = fa[wtop[x]];
  }
  return dep[x] < dep[y] ? x : y;
}
bool tag[N];
vector<int> vir[N];
template <bool d>
inline void link(vector<int>* g, int x, int y) {
  g[x].push_back(y);
  if (d) g[y].push_back(x);
}
long long sum[N], X, Y;
void dfs(int x) {
  sum[x] = tag[x] ? a[x] : 0ll;
  for (auto y : vir[x]) {
    dfs(y);
    (Y += sum[x] * sum[y] % mod * dep[x] % mod) %= mod;
    (sum[x] += sum[y]) %= mod;
  }
  vir[x].clear(), tag[x] = 0;
}
long long solve(int rt, int* vtx, int cnt) {
  X = Y = 0ll, dfs(rt);
  for (int i = 1; i <= cnt; i++)
    (X += a[vtx[i]] * 1ll * dep[vtx[i]] % mod * sum[rt] % mod) %= mod;
  (Y *= 2) %= mod;
  for (int i = 1; i <= cnt; i++)
    (Y = Y + a[vtx[i]] * 1ll * a[vtx[i]] % mod * dep[vtx[i]] % mod + mod) % mod;
  (X *= 2) %= mod, (Y *= 2) %= mod;
  return (X - Y + mod) % mod;
}
signed main() {
  n = read(), sieve(n);
  for (int i = 1; i <= n; i++) loc[a[i] = read()] = i, a[i] = phi[a[i]];
  for (int i = 1, u, v; i < n; i++) u = read(), v = read(), link<1>(adj, u, v);
  dfs1(1, 0), dfs2(1, 1);
  for (int d = 1; d <= n; d++) {
    static int vtx[N];
    int cnt = 0;
    for (int x = d; x <= n; x += d) tag[vtx[++cnt] = loc[x]] = 1;
    sort(vtx + 1, vtx + 1 + cnt, [](int a, int b) { return dfn[a] < dfn[b]; });
    static int stk[N];
    int top = 0;
    stk[top = 1] = vtx[1];
    for (int i = 2; i <= cnt; i++) {
      int x = vtx[i], l = lca(x, stk[top]);
      for (; top > 1 && dep[l] <= dep[stk[top - 1]]; --top)
        link<0>(vir, stk[top - 1], stk[top]);
      if (stk[top] != l) link<0>(vir, l, stk[top]), stk[top] = l;
      stk[++top] = x;
    }
    for (; top > 1; --top) link<0>(vir, stk[top - 1], stk[top]);
    g[d] = solve(stk[1], vtx, cnt);
  }
  for (int x = 1; x <= n; x++)
    for (int d = x; d <= n; d += x) (f[x] += g[d] * mu[d / x] + mod) %= mod;
  long long ans = 0ll;
  for (int i = 1; i <= n; i++)
    (ans += i * inv(phi[i]) % mod * f[i] % mod) %= mod;
  printf("%lld\n", ans * inv(n * 1ll * (n - 1)) % mod);
  return 0;
}
