#include <bits/stdc++.h>
using namespace std;
inline int read() {
  register int data = 0, w = 1;
  char ch = 0;
  while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
  if (ch == '-') w = -1, ch = getchar();
  while (ch >= '0' && ch <= '9')
    data = (data << 1) + (data << 3) + (ch ^ 48), ch = getchar();
  return data * w;
}
int n, phi[1000005], v[1000005], vis[1000005], p[1000005];
const int mod = 1e9 + 7;
void init(int n = 200000) {
  phi[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (!vis[i]) p[++p[0]] = i, phi[i] = i - 1;
    for (int j = 1; j <= p[0]; j++) {
      if (i * p[j] > n) break;
      vis[i * p[j]] = 1;
      if (i % p[j] == 0) {
        phi[i * p[j]] = phi[i] * p[j];
        break;
      }
      phi[i * p[j]] = phi[i] * phi[p[j]];
    }
  }
  memset(p, 0, sizeof(p));
}
int KSM(int x, int k) {
  int tmp = 1, y = x;
  for (int i = k; i; i >>= 1, y = 1ll * y * y % mod)
    if (i & 1) tmp = 1ll * tmp * y % mod;
  return tmp;
}
int h[1000005], cnt, pr[200005][19], de[1000005], dfn[1000005];
struct node {
  int to, next;
} w[1000005];
void add(int x, int y) {
  ++cnt;
  w[cnt].to = y;
  w[cnt].next = h[x];
  h[x] = cnt;
}
void dfs(int x, int fa) {
  dfn[x] = ++dfn[0];
  pr[x][0] = fa;
  de[x] = de[fa] + 1;
  for (int i = 1; i <= 17; i++) pr[x][i] = pr[pr[x][i - 1]][i - 1];
  for (int i = h[x]; i; i = w[i].next) {
    int y = w[i].to;
    if (y == fa) continue;
    dfs(y, x);
  }
}
int lca(int x, int y) {
  if (de[x] < de[y]) swap(x, y);
  for (int j = 17; j >= 0; j--)
    if (de[pr[x][j]] >= de[y]) x = pr[x][j];
  if (x == y) return x;
  for (int j = 17; j >= 0; j--)
    if (pr[x][j] != pr[y][j]) x = pr[x][j], y = pr[y][j];
  return pr[x][0];
}
int a[1000005], f[1000005], q[1000005], s[1000005], top, first[1000005],
    second[1000005], ans;
vector<int> C, V[200005];
void DP(int x, int d) {
  if (a[x] % d == 0)
    first[x] = v[x], second[x] = 1ll * v[x] * de[x] % mod;
  else
    first[x] = second[x] = 0;
  for (auto y : V[x]) {
    DP(y, d);
    ans = (ans + 1ll * first[x] * second[y] + 1ll * second[x] * first[y] -
           1ll * first[x] * first[y] % mod * 2 * de[x]) %
          mod;
    first[x] = (first[x] + first[y]) % mod;
    second[x] = (second[x] + second[y]) % mod;
  }
  C.push_back(x);
}
void solve(int d) {
  q[0] = 0;
  for (int i = d; i <= n; i += d) q[++q[0]] = p[i];
  if (a[1] % d != 0) q[++q[0]] = 1;
  sort(q + 1, q + q[0] + 1, [](int x, int y) { return dfn[x] < dfn[y]; });
  top = 0;
  ans = 0;
  for (int i = 1; i <= q[0]; i++) {
    int x = q[i], LCA = lca(x, s[top]);
    if (LCA == s[top]) {
      s[++top] = x;
      continue;
    }
    while (top > 1 && de[LCA] <= de[s[top - 1]])
      V[s[top - 1]].push_back(s[top]), --top;
    if (s[top] != LCA) V[LCA].push_back(s[top--]), s[++top] = LCA;
    s[++top] = x;
  }
  while (top > 1) V[s[top - 1]].push_back(s[top]), --top;
  DP(1, d);
  ans = 1ll * ans * 2 % mod;
  f[d] = ans;
  for (auto x : C) first[x] = second[x] = 0, V[x].clear();
  C.clear();
}
int main() {
  init();
  n = read();
  for (int i = 1; i <= n; i++) a[i] = read(), p[a[i]] = i;
  for (int i = 1; i <= n - 1; i++) {
    int x = read(), y = read();
    add(x, y);
    add(y, x);
  }
  dfs(1, 0);
  for (int i = 1; i <= n; i++) v[i] = phi[a[i]];
  for (int i = 1; i <= n; i++) solve(i);
  int Ans = 0;
  for (int i = n; i >= 1; i--) {
    for (int j = i + i; j <= n; j += i) f[i] = (f[i] - f[j]) % mod;
    Ans = (Ans + 1ll * f[i] * i % mod * KSM(phi[i], mod - 2)) % mod;
  }
  Ans = 1ll * Ans * KSM(1ll * n * (n - 1) % mod, mod - 2) % mod;
  Ans += mod;
  Ans %= mod;
  cout << Ans << "\n";
  return 0;
}
