#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -1;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  return x * f;
}
const int MAXN = 200010;
const int INF = 1e9;
const long long Mod = 1e9 + 7;
int N;
int a[MAXN + 1];
long long ans, ret;
long long g[MAXN + 1], phi[MAXN + 1], inv[MAXN + 1];
int sta[MAXN + 1], top;
vector<int> V[MAXN + 1], vec[MAXN + 1];
int Node[MAXN << 1], Next[MAXN << 1], Root[MAXN + 1];
int dep[MAXN + 1];
int cnt;
int fa[20][MAXN + 1];
int pri[MAXN + 1];
long long mu[MAXN + 1];
int c[MAXN + 1], all;
int b[MAXN + 1], n;
bool vis[MAXN + 1];
inline void Add(long long &a, long long b) {
  a = (a + b >= Mod ? a + b - Mod : a + b);
}
int dfn[MAXN + 1], tim;
long long sumall;
bool cmpdfn(int a, int b) { return dfn[a] < dfn[b]; }
inline void link(int u, int v) { V[u].push_back(v); }
inline void insert(int u, int v) {
  Node[++cnt] = v;
  Next[cnt] = Root[u];
  Root[u] = cnt;
  return;
}
inline void init() {
  inv[1] = 1;
  for (int i = 2; i <= N; i++)
    inv[i] = (Mod - (Mod / i) * inv[Mod % i] % Mod) % Mod;
  phi[1] = 1;
  mu[1] = 1;
  for (int i = 2; i <= N; i++) {
    if (!vis[i]) mu[i] = Mod - 1, pri[++cnt] = i, phi[i] = i - 1;
    for (int j = 1; j <= cnt && 1LL * pri[j] * i <= N; j++) {
      vis[pri[j] * i] = 1;
      if (i % pri[j] == 0) {
        mu[i * pri[j]] = 0;
        phi[i * pri[j]] = phi[i] * pri[j];
        break;
      }
      mu[i * pri[j]] = Mod - mu[i];
      phi[i * pri[j]] = phi[i] * (pri[j] - 1);
    }
  }
  for (int i = 1; i <= N; i++) {
    long long fi = i * inv[phi[i]] % Mod;
    for (int j = 1; (long long)j * i <= N; j++) Add(g[i * j], fi * mu[j] % Mod);
  }
  return;
}
inline int LCA(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  for (int i = 19; i >= 0; i--)
    if (dep[u] - dep[v] >= (1 << i)) u = fa[i][u];
  for (int i = 19; i >= 0; i--)
    if (fa[i][u] != fa[i][v]) u = fa[i][u], v = fa[i][v];
  if (u != v) return fa[0][u];
  return u;
}
inline void dfs(int k, int Fa) {
  fa[0][k] = Fa;
  dfn[k] = ++tim;
  dep[k] = dep[Fa] + 1;
  for (int j = 1; j <= 19; j++) fa[j][k] = fa[j - 1][fa[j - 1][k]];
  for (int x = Root[k]; x; x = Next[x]) {
    int v = Node[x];
    if (v == Fa) continue;
    dfs(v, k);
  }
}
inline void extend(int x) {
  if (!top) {
    sta[++top] = x;
    c[++all] = x;
    return;
  }
  int y = LCA(x, sta[top]);
  c[++all] = y;
  while (top > 1 && dep[y] <= dep[sta[top - 1]])
    link(sta[top - 1], sta[top]), --top;
  if (sta[top] != y) link(y, sta[top]);
  sta[top] = y;
  sta[++top] = x;
  c[++all] = x;
}
long long sum[MAXN + 1];
inline void dfs2(int k) {
  sum[k] = (vis[k] ? phi[a[k]] : 0);
  for (int i = 0, sz = V[k].size(); i < sz; i++) {
    int v = V[k][i];
    dfs2(v);
    Add(sum[k], sum[v]);
    Add(ret,
        (sumall - sum[v] + Mod) % Mod * sum[v] % Mod * (dep[v] - dep[k]) % Mod);
  }
  return;
}
inline void solve(int K) {
  if (!n) return;
  ret = 0;
  sumall = 0;
  top = 0;
  all = 0;
  sort(b + 1, b + n + 1, cmpdfn);
  if (b[1] != 1) extend(1);
  for (int i = 1; i <= n; i++)
    extend(b[i]), vis[b[i]] = 1, Add(sumall, phi[a[b[i]]]);
  while (top > 1) link(sta[top - 1], sta[top]), --top;
  dfs2(1);
  Add(ans, ret * g[K] % Mod * 2 % Mod);
  for (int i = 1; i <= all; i++) V[c[i]].clear(), vis[c[i]] = 0;
}
long long F[MAXN + 1], f[MAXN + 1];
int main() {
  N = read();
  init();
  cnt = 0;
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i <= N; i++) a[i] = read();
  for (int i = 1; i < N; i++) {
    int u = read(), v = read();
    insert(u, v);
    insert(v, u);
  }
  dfs(1, 0);
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j * j <= a[i]; j++) {
      if (a[i] % j == 0) {
        vec[j].push_back(i);
        if (j * j != a[i]) vec[a[i] / j].push_back(i);
      }
    }
  }
  long long ans2 = 0;
  for (int i = 1; i <= N; i++) {
    n = 0;
    for (int j = 0, sz = vec[i].size(); j < sz; j++) b[++n] = vec[i][j];
    solve(i);
  }
  printf("%lld\n", ans * inv[N] % Mod * inv[N - 1] % Mod);
  return 0;
}
