#include <bits/stdc++.h>
template <typename T>
inline void read(T &t) {
  int f = 0, c = getchar();
  t = 0;
  while (!isdigit(c)) f |= c == '-', c = getchar();
  while (isdigit(c)) t = t * 10 + c - 48, c = getchar();
  if (f) t = -t;
}
template <typename T>
void write(T x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + 48);
}
template <typename T>
inline void writeln(T x) {
  write(x);
  puts("");
}
template <typename T>
inline bool chkmin(T &x, const T &y) {
  return y < x ? (x = y, 1) : 0;
}
template <typename T>
inline bool chkmax(T &x, const T &y) {
  return x < y ? (x = y, 1) : 0;
}
const int maxn = 2e5 + 207;
const long long mod = 1e9 + 7;
struct Edge {
  int to, w;
  Edge(int v, int ww = 0) : to(v), w(ww) {}
  Edge() : to(0), w(0) {}
};
struct Tree {
  std::vector<Edge> G[maxn];
  void ae(int x, int y, int z = 0) {
    G[x].emplace_back(y, z);
    G[y].emplace_back(x, z);
  }
};
Tree T, V;
int dep[maxn], st[maxn], ed[maxn], euler[maxn << 2], xys;
int md[30][maxn << 2], lg[maxn << 2];
int p[maxn];
void dfs1(int x, int fa) {
  dep[x] = dep[fa] + 1;
  euler[++xys] = x;
  st[x] = xys;
  for (unsigned i = 0, sz = T.G[x].size(); i < sz; ++i) {
    int v = T.G[x][i].to;
    if (v != fa) {
      dfs1(v, x);
      euler[++xys] = x;
    }
  }
  ed[x] = xys;
}
inline void init() {
  for (int i = 2; i <= xys; ++i) lg[i] = lg[i >> 1] + 1;
  for (int i = 1; i <= xys; ++i) md[0][i] = euler[i];
  for (int j = 1; 1 << j <= xys; ++j)
    for (int i = 1; i + (1 << j) - 1 <= xys; ++i) {
      int k = i + (1 << (j - 1));
      if (dep[md[j - 1][i]] < dep[md[j - 1][k]])
        md[j][i] = md[j - 1][i];
      else
        md[j][i] = md[j - 1][k];
    }
}
inline int getlca(int x, int y) {
  int l = st[x], r = ed[y];
  if (l > r) l = st[y], r = ed[x];
  int k = lg[r - l + 1], t = r - (1 << k) + 1;
  return dep[md[k][l]] < dep[md[k][t]] ? md[k][l] : md[k][t];
}
inline int getdist(int x, int y) {
  return dep[x] + dep[y] - (dep[getlca(x, y)] << 1);
}
long long tmp[maxn], invphi[maxn];
int phi[maxn];
int mu[maxn], pri[maxn];
bool ff[maxn];
inline long long qpow(long long x, long long k) {
  long long s = 1;
  for (; k; x = x * x % mod, k >>= 1)
    if (k & 1) s = s * x % mod;
  return s;
}
inline void sieve(int n) {
  mu[1] = phi[1] = 1;
  for (int i = 2; i <= n; ++i) {
    if (!ff[i]) {
      phi[i] = i - 1;
      mu[i] = -1;
      pri[++pri[0]] = i;
    }
    for (int j = 1; j <= pri[0]; ++j) {
      int x = i * pri[j];
      if (x > n) break;
      ff[x] = 1;
      if (i % pri[j]) {
        mu[x] = -mu[i];
        phi[x] = phi[i] * phi[pri[j]];
      } else {
        mu[x] = 0;
        phi[x] = phi[i] * pri[j];
        break;
      }
    }
  }
}
inline bool cmp(int a, int b) { return st[a] < st[b]; }
int stk[maxn], top;
int vs[maxn], vk;
inline void insert(int x) {
  if (!top) {
    stk[++top] = x;
    return;
  }
  int l = getlca(x, stk[top]);
  while (top > 1 && dep[stk[top - 1]] > dep[l]) {
    int u = stk[top - 1], v = stk[top];
    V.ae(u, v, getdist(u, v));
    --top;
  }
  if (dep[l] < dep[stk[top]]) {
    V.ae(l, stk[top], getdist(l, stk[top]));
    --top;
  }
  if (!top || dep[stk[top]] < dep[l]) stk[++top] = l;
  stk[++top] = x;
}
inline void build() {
  std::sort(vs + 1, vs + vk + 1, cmp);
  top = 0;
  if (vs[1] != 1) stk[top = 1] = 1;
  for (int i = 1; i <= vk; ++i) insert(vs[i]);
  while (top > 1) {
    int u = stk[top], v = stk[top - 1];
    V.ae(u, v, getdist(u, v));
    --top;
  }
}
long long f[maxn], g[maxn], s[maxn];
int b[maxn], a[maxn];
void dfs2(int x, int fa) {
  f[x] = g[x] = 0;
  s[x] = b[x];
  for (unsigned i = 0, sz = V.G[x].size(); i < sz; ++i) {
    int v = V.G[x][i].to, w = V.G[x][i].w;
    if (v != fa) {
      dfs2(v, x);
      g[x] = (g[x] + g[v] + s[v] * (f[x] + s[x] * w % mod) % mod +
              f[v] * s[x] % mod) %
             mod;
      s[x] = (s[x] + s[v]) % mod;
      f[x] = (f[x] + f[v] + s[v] * w % mod) % mod;
    }
  }
  V.G[x].clear();
  b[x] = 0;
}
int n;
int main() {
  read(n);
  for (int i = 1; i <= n; ++i) read(a[i]), p[a[i]] = i;
  for (int i = 1; i != n; ++i) {
    int x, y;
    read(x);
    read(y);
    T.ae(x, y);
  }
  dfs1(1, 0);
  init();
  sieve(n);
  for (int i = 1; i <= n; ++i) invphi[i] = qpow(phi[i], mod - 2);
  for (int d = 1; d <= n; ++d)
    for (int i = d; i <= n; i += d) {
      tmp[i] = (tmp[i] + 1ll * d * mu[i / d] % mod * invphi[d] % mod) % mod;
      if (tmp[i] < 0) tmp[i] += mod;
    }
  long long ans = 0;
  for (int i = 1; i <= n; ++i) {
    vk = 0;
    for (int j = i; j <= n; j += i) {
      vs[++vk] = p[j];
      b[p[j]] = phi[j];
    }
    build();
    dfs2(1, 0);
    ans = (ans + tmp[i] * 2ll * g[1] % mod) % mod;
  }
  ans = ans * qpow(n, mod - 2) % mod * qpow(n - 1, mod - 2) % mod;
  writeln(ans);
  return 0;
}
