#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int n, h[200005], cnt, a[200005], S[200005], s[200005], tmp;
int top[200005], fa[200005], fp[200005], vis[200005], Ans;
int phi[200005], mu[200005], p[200005], in[200005], S1[200005];
int son[200005], siz[200005], dep[200005], Top, S2[200005];
vector<int> g[200005];
struct edge {
  int to, next;
} e[200005 << 1];
inline int read() {
  int s = 0, f = 0;
  char ch = getchar();
  while (ch < 48 || ch > 57) f = (ch == '-'), ch = getchar();
  while (ch > 47 && ch < 58)
    s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
  return f ? -s : s;
}
int Mod(int x) { return x < mod ? x : x - mod; }
void Addedge(int x, int y) {
  e[++cnt] = (edge){y, h[x]}, h[x] = cnt;
  e[++cnt] = (edge){x, h[y]}, h[y] = cnt;
}
int Ksm(int a, int n, int ans = 1) {
  for (; n; n >>= 1, a = 1ll * a * a % mod)
    if (n & 1) ans = 1ll * ans * a % mod;
  return ans;
}
void Pre(int n) {
  mu[1] = phi[1] = 1;
  for (int i = 2; i <= n; ++i) {
    if (!phi[i]) phi[i] = i - 1, mu[i] = mod - 1, p[++cnt] = i;
    for (int j = 1; i * p[j] <= n && j <= cnt; ++j) {
      if (i % p[j] == 0) {
        phi[i * p[j]] = phi[i] * p[j];
        break;
      }
      phi[i * p[j]] = phi[i] * (p[j] - 1), mu[i * p[j]] = mod - mu[i];
    }
  }
  for (int i = 1; i <= n; ++i) {
    int tmp = 1ll * i * Ksm(phi[i], mod - 2) % mod;
    for (int j = 1; i * j <= n; ++j)
      S[i * j] = (S[i * j] + 1ll * tmp * mu[j]) % mod;
  }
}
void Dfs1(int x, int p) {
  dep[x] = dep[fa[x] = p] + (siz[x] = 1);
  for (int i = h[x], y; i; i = e[i].next)
    if ((y = e[i].to) != p)
      Dfs1(y, x), siz[x] += siz[y], siz[y] > siz[son[x]] && (son[x] = y);
}
void Dfs2(int x, int tp) {
  if (top[x] = tp, in[x] = ++cnt, son[x]) Dfs2(son[x], tp);
  for (int i = h[x], y; i; i = e[i].next)
    if ((y = e[i].to) != son[x] && y != fa[x]) Dfs2(y, y);
}
int Lca(int x, int y) {
  while (top[x] ^ top[y])
    (dep[top[x]] > dep[top[y]]) ? (x = fa[top[x]]) : (y = fa[top[y]]);
  return dep[x] < dep[y] ? x : y;
}
bool cmp(int x, int y) { return in[x] < in[y]; }
void Dfs(int x) {
  vis[x] ? (S1[x] = phi[a[x]], S2[x] = 1ll * phi[a[x]] * dep[x] % mod)
         : (S1[x] = S2[x] = 0);
  for (int y : g[x]) {
    Dfs(y), tmp = Mod((tmp + 1ll * S2[x] * S1[y] + 1ll * S1[x] * S2[y] -
                       2ll * S1[x] * S1[y] % mod * dep[x]) %
                          mod +
                      mod);
    S1[x] = Mod(S1[x] + S1[y]), S2[x] = Mod(S2[x] + S2[y]);
  }
  g[x].clear();
}
void Weaktree(int id) {
  sort(p + 1, p + cnt + 1, cmp), s[Top = 1] = 1;
  for (int i = 1; i <= cnt; ++i) {
    int x = p[i], lca = Lca(s[Top], x);
    if (lca == s[Top])
      ((x ^ s[Top]) ? s[++Top] = x : 0);
    else {
      while (dep[s[Top - 1]] > dep[lca]) g[s[Top - 1]].push_back(s[Top]), --Top;
      if (g[lca].push_back(s[Top--]), s[Top] != lca) s[++Top] = lca;
      if (s[Top] != x) s[++Top] = x;
    }
  }
  while (Top > 1) g[s[Top - 1]].push_back(s[Top]), --Top;
  tmp = 0;
  Dfs(1);
  Ans = (Ans + 1ll * tmp * S[id]) % mod;
  for (int i = 1; i <= cnt; ++i) vis[p[i]] = 0;
}
signed main() {
  n = read(), Pre(n), cnt = 0;
  for (int i = 1; i <= n; ++i) fp[a[i] = read()] = i;
  for (int i = 1; i < n; ++i) Addedge(read(), read());
  Dfs1(1, cnt = 0), Dfs2(1, 1);
  for (int dp = 1; dp <= n; ++dp) {
    cnt = 0;
    for (int i = dp; i <= n; i += dp) vis[p[++cnt] = fp[i]] = 1;
    Weaktree(dp);
  }
  cout << 1ll * Ans * Ksm((n * (n - 1ll) >> 1) % mod, mod - 2) % mod;
  return 0;
}
