#include <bits/stdc++.h>
using namespace std;
int const p = 1e9 + 7;
int mod(int x) { return x >= p ? x - p : x; }
int ss, s2, F[200005], s[200005], sum, a[200005], b[200005], dfn[200005], tim,
    f[400005][19], deep[200005], phi[200005], pr[50005], cnt, st[200005], top,
    lg[400005];
bool flag[200005];
int merge(int x, int y) { return deep[x] < deep[y] ? x : y; }
vector<int> to[200005], to2[200005];
void dfs(int x, int fa) {
  dfn[x] = ++tim;
  deep[x] = deep[fa] + 1;
  f[tim][0] = x;
  for (auto tar : to[x])
    if (tar != fa) dfs(tar, x), f[++tim][0] = x;
}
int lca(int x, int y) {
  x = dfn[x];
  y = dfn[y];
  if (x > y) swap(x, y);
  int t = lg[y - x + 1];
  return merge(f[x][t], f[y - (1 << t) + 1][t]);
}
void dfs2(int x, int fa) {
  s[x] = flag[x] ? phi[a[x]] : 0;
  if (flag[x])
    sum = (sum - 2ll * phi[a[x]] * phi[a[x]] % p * deep[x] % p + p) % p;
  for (auto tar : to2[x]) {
    if (tar == fa) continue;
    dfs2(tar, x);
    sum = (sum - 4ll * deep[x] * s[x] % p * s[tar] % p + p) % p;
    s[x] = mod(s[x] + s[tar]);
  }
  to2[x].clear();
}
int pw(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1) res = 1ll * res * x % p;
    x = 1ll * x * x % p;
    y >>= 1;
  }
  return res;
}
int main() {
  int n, x, y;
  scanf("%d", &n);
  for (int i = 2; i <= 2 * n; i++) lg[i] = lg[i >> 1] + 1;
  phi[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (!flag[i]) phi[i] = i - 1, pr[++cnt] = i;
    for (int j = 1; j <= cnt && i * pr[j] <= n; j++) {
      flag[i * pr[j]] = 1;
      if (!(i % pr[j])) {
        phi[i * pr[j]] = phi[i] * pr[j];
        break;
      }
      phi[i * pr[j]] = phi[i] * (pr[j] - 1);
    }
  }
  memset(flag, 0, sizeof(flag));
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[a[i]] = i;
  for (int i = 1; i < n; i++)
    scanf("%d%d", &x, &y), to[x].push_back(y), to[y].push_back(x);
  dfs(1, 0);
  for (int k = 1; k <= 18; k++)
    for (int i = 1; i + (1 << k) - 1 <= tim; i++)
      f[i][k] = merge(f[i][k - 1], f[i + (1 << (k - 1))][k - 1]);
  for (int d = 1; d <= n; d++) {
    vector<int> v;
    ss = s2 = 0;
    for (int i = d; i <= n; i += d)
      v.push_back(b[i]), flag[b[i]] = 1, ss = mod(ss + phi[i]),
                         s2 = (s2 + 1ll * phi[i] * deep[b[i]]) % p;
    sort(v.begin(), v.end(),
         [&](const int &x, const int &y) { return dfn[x] < dfn[y]; });
    st[top = 1] = v[0];
    for (int i = 1; i < v.size(); i++) {
      int now = v[i];
      while (1) {
        int g = lca(st[top], now);
        if (g == st[top]) break;
        if (deep[g] <= deep[st[top - 1]])
          to2[st[top - 1]].push_back(st[top]), top--;
        else {
          to2[g].push_back(st[top]);
          st[top] = g;
          break;
        }
      }
      st[++top] = now;
    }
    while (top) to2[st[top - 1]].push_back(st[top]), top--;
    sum = 0;
    dfs2(st[1], 0);
    F[d] = (sum + 2ll * ss * s2) % p;
    for (int i = d; i <= n; i += d) flag[b[i]] = 0;
  }
  for (int i = n; i >= 1; i--)
    for (int j = i * 2; j <= n; j += i) F[i] = mod(F[i] - F[j] + p);
  int ans = 0;
  for (int i = 1; i <= n; i++)
    ans = (ans + 1ll * i * pw(phi[i], p - 2) % p * F[i]) % p;
  printf("%lld", 1ll * ans * pw(1ll * n * (n - 1) % p, p - 2) % p);
  return 0;
}
