#include <bits/stdc++.h>
using namespace std;
inline int getint() {
  static char c;
  while ((c = getchar()) < '0' || c > '9')
    ;
  int res = c - '0';
  while ((c = getchar()) >= '0' && c <= '9') res = res * 10 + c - '0';
  return res;
}
const int MaxN = 200005;
const int M = 1000000007;
inline int add(int a, const int &b) {
  a += b;
  return a >= M ? a - M : a;
}
inline int dec(int a, const int &b) {
  a -= b;
  return a < 0 ? a + M : a;
}
int n;
int key[MaxN];
vector<int> adj[MaxN];
int inv[MaxN];
int phi[MaxN];
vector<int> divs[MaxN];
vector<int> coe[MaxN];
int prod[MaxN];
inline void init_math() {
  inv[1] = phi[1] = 1;
  for (int i = 2; i <= n; ++i) {
    phi[i] = i;
    inv[i] = (long long)(M - M / i) * inv[M % i] % M;
  }
  for (int i = 1; i <= n; ++i) {
    divs[i].push_back(i);
    for (int j = i << 1; j <= n; j += i) {
      divs[j].push_back(i);
      phi[j] -= phi[i];
    }
  }
  for (int i = 1; i <= n; ++i) coe[i].resize(divs[i].size());
  coe[1][0] = 1;
  for (int i = 2; i <= n; ++i) {
    int p = divs[i][1];
    if (p == i) {
      coe[i][0] = 1;
      coe[i][1] = inv[p - 1];
      continue;
    }
    int q = i;
    while (q % p == 0) q /= p;
    for (int d : divs[i]) prod[d] = 0;
    for (int i = 0; i < divs[p].size(); ++i)
      for (int j = 0; j < divs[q].size(); ++j) {
        int u = divs[p][i], a = coe[p][i];
        int v = divs[q][j], b = coe[q][j];
        int x = u * v, y = (long long)a * b % M;
        prod[x] = add(prod[x], y);
      }
    for (int j = 0; j < divs[i].size(); ++j) coe[i][j] = prod[divs[i][j]];
  }
}
bool book[MaxN];
int q_n, q[MaxN];
int fa[MaxN];
int dep[MaxN];
int size[MaxN];
inline void bfs(const int &sv, const int &prev) {
  q[q_n = 1] = sv;
  fa[sv] = prev, dep[sv] = 1;
  for (int i = 1; i <= q_n; ++i) {
    int u = q[i];
    for (int v : adj[u])
      if (!book[v] && v != fa[u]) {
        fa[v] = u;
        dep[v] = dep[u] + 1;
        q[++q_n] = v;
      }
  }
}
inline int centroid(int root) {
  bfs(root, 0);
  int vC = 0, wC = q_n;
  for (int i = 1; i <= q_n; ++i) size[q[i]] = 1;
  for (int i = q_n; i >= 1; --i) {
    int u = q[i];
    size[fa[u]] += size[u];
    int vW = q_n - size[u];
    for (int v : adj[u])
      if (!book[v] && v != fa[u]) vW = max(vW, size[v]);
    if (vW < wC) wC = vW, vC = u;
  }
  return vC;
}
int nVer = 0;
int ver[MaxN];
int sum = 0;
int sum_phi[MaxN];
inline int calc(int v) {
  int sum = 0;
  for (int i = 0; i < divs[v].size(); ++i) {
    int d = divs[v][i];
    sum = add(sum, (long long)coe[v][i] * sum_phi[d] % M);
  }
  return (long long)sum * phi[v] % M;
}
inline void work(int vC) {
  nVer = q_n;
  for (int i = 1; i <= q_n; ++i) ver[i] = q[i];
  for (int i = 1; i <= nVer; ++i) {
    int v = key[ver[i]];
    for (int d : divs[v]) sum_phi[d] = add(sum_phi[d], phi[v]);
  }
  for (int u : adj[vC])
    if (!book[u]) {
      bfs(u, vC);
      for (int i = 1; i <= q_n; ++i) {
        int v = key[q[i]];
        for (int d : divs[v]) sum_phi[d] = dec(sum_phi[d], phi[v]);
      }
      for (int i = 1; i <= q_n; ++i) {
        int v = q[i];
        int w = key[v];
        sum = add(sum, (long long)dep[v] * calc(w) % M);
      }
      for (int i = 1; i <= q_n; ++i) {
        int v = key[q[i]];
        for (int d : divs[v]) sum_phi[d] = add(sum_phi[d], phi[v]);
      }
    }
  for (int i = 1; i <= nVer; ++i) {
    int v = key[ver[i]];
    for (int d : divs[v]) sum_phi[d] = 0;
  }
}
void solve(int root) {
  int vC = centroid(root);
  book[vC] = true;
  work(vC);
  for (int v : adj[vC])
    if (!book[v]) solve(v);
}
int main() {
  n = getint();
  for (int u = 1; u <= n; ++u) key[u] = getint();
  for (int i = 1; i < n; ++i) {
    int u = getint(), v = getint();
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  init_math();
  solve(1);
  sum = (long long)sum * inv[n] % M;
  sum = (long long)sum * inv[n - 1] % M;
  sum = (long long)sum * 2 % M;
  printf("%d\n", sum);
  return 0;
}
