#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10, P = 1e9 + 7;
int n, a[N], b[N], inv[N], dep[N], phi[N], p[N], val[N];
int fa[N], son[N], sz[N], top[N], L[N];
vector<int> g[N], G[N];
int cmp(int x, int y) { return L[x] < L[y]; }
void add(int &x, int64_t y) { x = (x + y) % P; }
void dfs(int x, int f, int d) {
  dep[x] = d, fa[x] = f, sz[x] = 1, L[x] = ++*L;
  for (int y : g[x])
    if (y != f) {
      dfs(y, x, d + 1);
      sz[x] += sz[y];
      if (sz[y] > sz[son[x]]) son[x] = y;
    }
}
void dfs(int x, int f) {
  top[x] = f;
  if (son[x]) dfs(son[x], f);
  for (int y : g[x])
    if (!top[y]) dfs(y, y);
}
int lca(int x, int y) {
  while (top[x] != top[y]) {
    if (dep[top[x]] < dep[top[y]])
      y = fa[top[y]];
    else
      x = fa[top[x]];
  }
  return dep[x] < dep[y] ? x : y;
}
int dis(int x, int y) { return dep[x] + dep[y] - 2 * dep[lca(x, y)]; }
int dp[N], sum_val[N], sum_val_d[N];
void DP(int x) {
  dp[x] = 0;
  sum_val[x] = val[x];
  sum_val_d[x] = val[x] * (int64_t)dep[x] % P;
  for (int y : G[x]) {
    DP(y);
    add(dp[x], dp[y]);
    add(sum_val[x], sum_val[y]);
    add(sum_val_d[x], sum_val_d[y]);
  }
  add(dp[x], val[x] * (sum_val_d[x] - val[x] * (int64_t)dep[x] % P));
  add(dp[x], val[x] * (int64_t)dep[x] % P * (sum_val[x] - val[x]));
  add(dp[x], -val[x] * int64_t(sum_val[x] - val[x]) % P * 2 * dep[x]);
  for (int y : G[x]) {
    add(dp[x], sum_val[y] * int64_t(sum_val_d[x] - sum_val_d[y]));
    add(dp[x], sum_val_d[y] * int64_t(sum_val[x] - sum_val[y]));
    add(dp[x], -sum_val[y] * int64_t(sum_val[x] - sum_val[y]) % P * 2 * dep[x]);
  }
}
int build(vector<int> a) {
  sort(a.begin(), a.end(), cmp);
  a.erase(unique(a.begin(), a.end()), a.end());
  vector<int> s, tmp;
  s.push_back(a[0]);
  for (int i = 1; i < a.size(); ++i) {
    int l = lca(a[i], a[i - 1]);
    tmp.push_back(l);
    if (dep[l] != dep[s.back()]) {
      while (s.size() > 1 && dep[s[s.size() - 2]] >= dep[l]) {
        G[s[s.size() - 2]].push_back(s.back());
        s.pop_back();
      }
      if (dep[s.back()] > dep[l]) {
        G[l].push_back(s.back());
        s.back() = l;
      }
    }
    s.push_back(a[i]);
  }
  while (s.size() > 1) {
    G[s[s.size() - 2]].push_back(s.back());
    s.pop_back();
  }
  DP(s[0]);
  for (int t : a) G[t].clear(), val[t] = 0;
  for (int t : tmp) G[t].clear();
  return dp[s[0]];
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  for (int i = 1; i <= n; ++i) phi[i] = b[a[i]] = i;
  inv[1] = 1;
  for (int i = 2; i <= n; ++i) {
    inv[i] = inv[P % i] * int64_t(P - P / i) % P;
    if (phi[i] != i) continue;
    for (int j = i; j <= n; j += i) phi[j] = phi[j] / i * (i - 1);
  }
  for (int i = 1; i <= n; ++i) p[i] = i * (int64_t)inv[phi[i]] % P;
  for (int i = 1; i <= n; ++i)
    for (int j = 2 * i; j <= n; j += i) add(p[j], -p[i]);
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(1, 0, 0), dfs(1, 1);
  int ans = 0;
  for (int i = 1; i <= n; ++i) {
    vector<int> v;
    for (int j = i; j <= n; j += i) {
      v.push_back(b[j]);
      val[b[j]] = phi[j];
    }
    add(ans, build(v) * (int64_t)p[i]);
  }
  ans = ans * (int64_t)inv[n] % P * inv[n - 1] % P;
  if (ans < 0) ans += P;
  printf("%d\n", ans);
}
