#include <bits/stdc++.h>
using namespace std;
struct pat {
  long long x, y;
  pat(long long x = 0, long long y = 0) : x(x), y(y) {}
  bool operator<(const pat &p) const { return x == p.x ? y < p.y : x < p.x; }
};
template <typename TP>
inline void read(TP &tar) {
  TP ret = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    ret = ret * 10 + (ch - '0');
    ch = getchar();
  }
  tar = ret * f;
}
namespace RKK {
const long long N = 400011, mo = 1000000007;
void doadd(long long &a, const long long &b) {
  if ((a += b) >= mo) a -= mo;
}
long long fpow(long long a, long long p) {
  long long ret = 1;
  while (p) {
    if (p & 1ll) ret = ret * a % mo;
    a = a * a % mo, p >>= 1;
  }
  return ret;
}
struct sumireko {
  long long to, ne;
} e[N];
long long he[N], ecnt;
void addline(long long f, long long t) {
  e[++ecnt].to = t;
  e[ecnt].ne = he[f], he[f] = ecnt;
}
long long phi[N], mu[N], pr[N], pc;
bool npr[N];
void sieve() {
  mu[1] = 1, phi[1] = 1;
  for (long long i = 2; i <= 200000; i++) {
    if (!npr[i]) pr[++pc] = i, mu[i] = -1, phi[i] = i - 1;
    for (long long j = 1; j <= pc && i * pr[j] <= 200000; j++) {
      npr[i * pr[j]] = 1;
      if (i % pr[j] == 0) {
        mu[i * pr[j]] = 0, phi[i * pr[j]] = phi[i] * pr[j];
        break;
      } else
        mu[i * pr[j]] = -mu[i], phi[i * pr[j]] = phi[i] * (pr[j] - 1);
    }
  }
}
long long n, w[N], iw[N];
long long ans;
long long fa[N], dep[N], size[N], dson[N], top[N];
long long ds[N], de[N], da;
bool cmp(const long long &a, const long long &b) { return ds[a] < ds[b]; }
void rip(long long x) {
  size[x] = 1;
  for (long long i = he[x], t = e[i].to; i; i = e[i].ne, t = e[i].to)
    if (t != fa[x])
      fa[t] = x, dep[t] = dep[x] + 1, rip(t), size[x] += size[t],
      dson[x] = size[dson[x]] > size[t] ? dson[x] : t;
}
void rip(long long x, long long tp) {
  ds[x] = ++da, top[x] = tp;
  if (dson[x]) rip(dson[x], tp);
  for (long long i = he[x], t = e[i].to; i; i = e[i].ne, t = e[i].to)
    if (t != fa[x] && t != dson[x]) rip(t, t);
  de[x] = da;
}
long long lca(long long x, long long 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;
}
long long dp[N];
bool vis[N];
void dfs(long long x) {
  if (vis[x])
    doadd(ans, 2ll * phi[w[x]] * phi[w[x]] * dep[x] % mo), dp[x] = phi[w[x]];
  for (long long i = he[x], t = e[i].to; i; i = e[i].ne, t = e[i].to)
    if (t != fa[x])
      dfs(t), doadd(ans, 4ll * dp[x] * dp[t] % mo * dep[x] % mo),
          doadd(dp[x], dp[t]);
}
long long lst[N], ln;
long long sta[N], stp;
long long f[N], F[N];
long long main() {
  sieve(), read(n);
  for (long long i = 1; i <= n; i++) read(w[i]), iw[w[i]] = i;
  for (long long i = 2, x, y; i <= n; i++)
    read(x), read(y), addline(x, y), addline(y, x);
  rip(1), rip(1, 1), memset(he, 0, sizeof(he)), ecnt = 0;
  for (long long i = 1; i <= n / 2; i++) {
    long long sum = 0, re = 0;
    for (long long j = i; j <= n; j += i)
      vis[iw[j]] = 1, doadd(sum, phi[j] * dep[iw[j]] % mo), doadd(re, phi[j]),
      lst[++ln] = iw[j];
    lst[++ln] = 1;
    sort(lst + 1, lst + 1 + ln, cmp);
    for (long long i = 1, lim = ln; i < lim; i++)
      lst[++ln] = lca(lst[i], lst[i + 1]);
    sort(lst + 1, lst + 1 + ln, cmp),
        ln = unique(lst + 1, lst + 1 + ln) - (lst + 1);
    for (long long i = 1; i <= ln; i++) {
      while (stp && de[sta[stp]] < ds[lst[i]]) stp--;
      if (stp) addline(sta[stp], lst[i]);
      sta[++stp] = lst[i];
    }
    dfs(1), F[i] = (sum * re * 2 % mo - ans + mo) % mo;
    for (long long i = 1; i <= ln; i++)
      dp[lst[i]] = vis[lst[i]] = he[lst[i]] = 0;
    ln = 0, ans = 0, ecnt = 0, stp = 0;
  }
  ans = 0;
  for (long long i = 1; i <= n; i++)
    for (long long j = i; j <= n; j += i)
      f[i] = (f[i] + F[j] * mu[j / i] + mo) % mo;
  for (long long i = 1; i <= n; i++)
    doadd(ans, f[i] * fpow(phi[i], mo - 2) % mo * i % mo);
  printf("%lld\n", ans * fpow(n, mo - 2) % mo * fpow(n - 1, mo - 2) % mo);
  return 0;
}
}  // namespace RKK
signed main() { return RKK::main(); }
