#include <bits/stdc++.h>
using namespace std;
const int N = 200005, mod = 1e9 + 7;
int n, head[N], nxt[N << 1], to[N << 1], num = 0, dfn[N], DFN = 0, a[N], dep[N];
inline void link(int x, int y) {
  nxt[++num] = head[x];
  to[num] = y;
  head[x] = num;
}
namespace tr {
int fa[N], top[N], sz[N], son[N];
inline void dfs1(int x) {
  sz[x] = 1;
  dfn[x] = ++DFN;
  for (int i = head[x]; i; i = nxt[i]) {
    int u = to[i];
    if (sz[u]) continue;
    fa[u] = x;
    dep[u] = dep[x] + 1;
    dfs1(u);
    sz[x] += sz[u];
    if (sz[u] > sz[son[x]]) son[x] = u;
  }
}
inline void dfs2(int x, int tp) {
  top[x] = tp;
  if (son[x]) dfs2(son[x], tp);
  for (int i = head[x]; i; i = nxt[i])
    if (to[i] != fa[x] && to[i] != son[x]) dfs2(to[i], to[i]);
}
inline int lca(int x, int y) {
  while (top[x] != top[y]) {
    if (dep[top[x]] < dep[top[y]]) swap(x, y);
    x = fa[top[x]];
  }
  return dep[x] < dep[y] ? x : y;
}
void main() {
  dep[1] = 1;
  dfs1(1);
  dfs2(1, 1);
}
}  // namespace tr
int prime[N], sp = 0, mu[N], phi[N], b[N], m = 0, id[N], g[N];
bool vis[N];
void priwork() {
  phi[1] = 1;
  mu[1] = 1;
  for (int to, i = 2; i <= n; i++) {
    if (!vis[i]) prime[++sp] = i, mu[i] = -1, phi[i] = i - 1;
    for (int j = 1; j <= sp && i * prime[j] <= n; j++) {
      vis[to = i * prime[j]] = 1;
      if (i % prime[j])
        mu[to] = -mu[i], phi[to] = phi[i] * (prime[j] - 1);
      else {
        phi[to] = phi[i] * prime[j];
        break;
      }
    }
  }
  tr::main();
}
inline bool comp(int i, int j) { return dfn[i] < dfn[j]; }
int st[N], top, w[N], f[N], inv[N], ST[N], cnt = 0;
inline int solve() {
  int sum = 0, x, lca, ret = 0, y = 0;
  top = 0;
  for (int i = 1; i <= m; i++)
    sum = (sum + phi[a[b[i]]]) % mod, w[b[i]] = phi[a[b[i]]];
  sort(b + 1, b + m + 1, comp);
  st[++top] = b[1];
  w[b[1]] = phi[a[b[1]]];
  ST[++cnt] = b[1];
  for (int i = 2; i <= m; i++) {
    x = b[i];
    y = 0;
    lca = tr::lca(x, st[top]);
    while (dep[lca] < dep[st[top]]) {
      if (y)
        ret = (ret + 1ll * (dep[y] - dep[st[top]]) * w[y] % mod *
                         (sum - w[y] + mod) % mod) %
              mod;
      if (y) w[st[top]] = (w[st[top]] + w[y]) % mod;
      y = st[top--];
    }
    if (st[top] != lca) st[++top] = lca, ST[++cnt] = lca;
    if (y)
      ret = (ret + 1ll * (dep[y] - dep[st[top]]) * w[y] % mod *
                       (sum - w[y] + mod) % mod) %
            mod;
    if (y) w[st[top]] = (w[st[top]] + w[y]) % mod;
    if (st[top] != x) st[++top] = x, ST[++cnt] = x;
  }
  while (top > 1) {
    ret = (ret + 1ll * (dep[st[top]] - dep[st[top - 1]]) * w[st[top]] % mod *
                     (sum - w[st[top]] + mod) % mod) %
          mod;
    w[st[top - 1]] = (w[st[top]] + w[st[top - 1]]) % mod;
    top--;
  }
  while (cnt) w[ST[cnt]] = 0, cnt--;
  return (ret << 1) % mod;
}
long long qm(long long x, long long k) {
  long long sum = 1;
  while (k) {
    if (k & 1) sum = sum * x % mod;
    x = x * x % mod;
    k >>= 1;
  }
  return sum;
}
void work() {
  int x, y;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]), id[a[i]] = i;
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &x, &y);
    link(x, y);
    link(y, x);
  }
  priwork();
  for (int i = 1; i <= n; i++) {
    m = 0;
    for (int j = i; j <= n; j += i) b[++m] = id[j];
    g[i] = solve();
  }
  for (int i = 1; i <= n; i++)
    for (int j = i; j <= n; j += i) f[i] = (f[i] + mu[j / i] * g[j]) % mod;
  int ans = 0;
  for (int i = 1; i <= n; i++) inv[i] = qm(i, mod - 2);
  for (int i = 1; i <= n; i++)
    ans = (ans + 1ll * i * inv[phi[i]] % mod * f[i] % mod) % mod;
  cout << ans * qm(1ll * n * (n - 1) % mod, mod - 2) % mod << endl;
}
int main() {
  work();
  return 0;
}
