#include <bits/stdc++.h>
using namespace std;
int n, tot, cnt, len, w[200100], son[200100], d[200100], size[200100],
    miu[200100], pri[200100], head[200100];
int ans, phi[200100], pinv[200100], s[200100], t[200100], tong[200100],
    tmp[200100], sum[200100], dp[200100], cf[200100];
bool vis[200100];
vector<int> v[200100];
struct point {
  int fr, to, nxt;
} a[2 * 200100];
int add(int x, int y) {
  return x + y >= 1000000007 ? x + y - 1000000007 : x + y;
}
int mul(int x, int y) { return 1LL * x * y % 1000000007; }
int dec(int x, int y) { return x - y < 0 ? x - y + 1000000007 : x - y; }
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
void Add(int x, int y) {
  a[++tot].fr = x;
  a[tot].to = y;
  a[tot].nxt = head[x];
  head[x] = tot;
}
long long qpow(long long x, int k) {
  long long ret = 1;
  while (k) {
    if (k & 1) ret = mul(ret, x);
    x = mul(x, x);
    k >>= 1;
  }
  return ret;
}
void init() {
  len = n;
  miu[1] = phi[1] = 1;
  for (int i = 2; i <= len; i++) {
    if (!vis[i]) pri[++cnt] = i, phi[i] = i - 1, miu[i] = -1;
    for (int j = 1; j <= cnt && i * pri[j] <= len; j++) {
      vis[i * pri[j]] = 1;
      if (i % pri[j] == 0) {
        phi[i * pri[j]] = mul(phi[i], pri[j]);
        break;
      } else {
        phi[i * pri[j]] = mul(phi[i], phi[pri[j]]);
        miu[i * pri[j]] = -1 * miu[i];
      }
    }
  }
  for (int i = 1; i <= len; i++) pinv[i] = mul(i, qpow(phi[i], 1000000007 - 2));
  for (int i = 1; i <= len; i++)
    for (int j = 1; i * j <= len; j++) {
      s[i] = add(s[i], phi[i * j]);
      v[i * j].push_back(i);
      sum[i * j] = add(sum[i * j], mul(miu[i] + 1000000007, pinv[j]));
    }
}
void dfs1(int x, int fa) {
  size[x] = v[w[x]].size();
  d[x] = d[fa] + 1;
  for (int i = head[x]; i; i = a[i].nxt) {
    int y = a[i].to;
    if (y == fa) continue;
    dfs1(y, x);
    size[x] += size[y];
    if (size[y] >= size[son[x]]) son[x] = y;
  }
}
void delt(int x, int fa) {
  for (int i = 0; i < v[w[x]].size(); i++) tong[v[w[x]][i]] = 0;
  for (int i = head[x]; i; i = a[i].nxt)
    if (a[i].to != fa) delt(a[i].to, x);
}
void add_tmp(int x, int fa) {
  for (int i = 0; i < v[w[x]].size(); i++)
    tmp[v[w[x]][i]] = add(tmp[v[w[x]][i]], phi[w[x]]);
  for (int i = head[x]; i; i = a[i].nxt)
    if (a[i].to != fa) add_tmp(a[i].to, x);
}
void del_tmp(int x, int fa, int st) {
  for (int i = 0; i < v[w[x]].size(); i++) {
    long long lst = mul(tong[v[w[x]][i]], dec(s[v[w[x]][i]], tong[v[w[x]][i]]));
    tong[v[w[x]][i]] = add(tong[v[w[x]][i]], tmp[v[w[x]][i]]);
    tmp[v[w[x]][i]] = 0;
    long long now = mul(tong[v[w[x]][i]], dec(s[v[w[x]][i]], tong[v[w[x]][i]]));
    cf[st] = add(cf[st], mul(dec(now, lst), sum[v[w[x]][i]]));
  }
  for (int i = head[x]; i; i = a[i].nxt)
    if (a[i].to != fa) del_tmp(a[i].to, x, st);
}
void dfs2(int x, int fa) {
  for (int i = head[x]; i; i = a[i].nxt) {
    int y = a[i].to;
    if (y == fa || y == son[x]) continue;
    dfs2(y, x);
    delt(y, x);
  }
  if (son[x]) dfs2(son[x], x);
  for (int i = head[x]; i; i = a[i].nxt) {
    int y = a[i].to;
    if (y == fa || y == son[x]) continue;
    add_tmp(y, x);
  }
  for (int i = 0; i < v[w[x]].size(); i++)
    tmp[v[w[x]][i]] = add(tmp[v[w[x]][i]], phi[w[x]]);
  for (int i = 0; i < v[w[x]].size(); i++) {
    long long lst = mul(tong[v[w[x]][i]], dec(s[v[w[x]][i]], tong[v[w[x]][i]]));
    tong[v[w[x]][i]] = add(tong[v[w[x]][i]], tmp[v[w[x]][i]]);
    tmp[v[w[x]][i]] = 0;
    long long now = mul(tong[v[w[x]][i]], dec(s[v[w[x]][i]], tong[v[w[x]][i]]));
    cf[x] = add(cf[x], mul(dec(now, lst), sum[v[w[x]][i]]));
  }
  for (int i = head[x]; i; i = a[i].nxt) {
    int y = a[i].to;
    if (y == fa || y == son[x]) continue;
    del_tmp(y, x, x);
  }
  dp[x] = add(dp[son[x]], cf[x]);
}
int main() {
  n = read();
  for (int i = 1; i <= n; i++) w[i] = read();
  for (int i = 1; i < n; i++) {
    int x = read(), y = read();
    Add(x, y);
    Add(y, x);
  }
  init();
  dfs1(1, 0);
  dfs2(1, 0);
  for (int i = 1; i <= n; i++) ans = add(ans, dp[i]);
  ans =
      mul(ans, qpow((long long)n * (n - 1) / 2ll % 1000000007, 1000000007 - 2));
  printf("%d\n", ans);
}
