#include <bits/stdc++.h>
using namespace std;
int n, a[200010], b[200010], phi[200010], pr[200010], lp;
int hd[200010], nt[200010 << 1], to[200010 << 1], tt;
int dep[200010], fa[200010][18], le[200010], d[200010], ld;
int qu[200010], lq, S[200010], top;
long long siz[200010], an[200010], ans, tol;
bool vis[200010];
int getint() {
  int w = 0;
  bool q = 0;
  char c = getchar();
  while ((c > '9' || c < '0') && c != '-') c = getchar();
  if (c == '-') c = getchar(), q = 1;
  while (c >= '0' && c <= '9') w = w * 10 + c - '0', c = getchar();
  return q ? -w : w;
}
bool cmp(int x, int y) { return le[x] < le[y]; }
long long mi(long long a, int b) {
  long long s = 1;
  while (b) {
    if (b & 1) s = s * a % 1000000007;
    a = a * a % 1000000007;
    b >>= 1;
  }
  return s;
}
void pre() {
  phi[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (!vis[i]) pr[++lp] = i, phi[i] = i - 1;
    for (int j = 1; pr[j] * i <= n; j++) {
      vis[pr[j] * i] = 1;
      if (i % pr[j])
        phi[pr[j] * i] = phi[i] * (pr[j] - 1);
      else {
        phi[pr[j] * i] = phi[i] * pr[j];
        break;
      }
    }
  }
}
void link(int x, int y, bool w) {
  if (w) {
    to[++tt] = y;
    nt[tt] = hd[x];
    hd[x] = tt;
    to[++tt] = x;
    nt[tt] = hd[y];
    hd[y] = tt;
  } else
    nt[y] = hd[x], hd[x] = y;
}
void dfs(int u, int o) {
  dep[u] = dep[o] + 1, le[u] = ++tt, fa[u][0] = o;
  for (int i = 1; (1 << i) < dep[u]; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
  for (int i = hd[u], v; v = to[i], i; i = nt[i])
    if (v != o) dfs(v, u);
}
int lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  int t = 1;
  while ((1 << t) < dep[x]) t++;
  t--;
  for (int i = t; i >= 0; i--)
    if (dep[fa[x][i]] >= dep[y]) x = fa[x][i];
  if (x == y) return x;
  for (int i = t; i >= 0; i--)
    if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}
void gi(long long &x) {
  if (x >= 1000000007) x %= 1000000007;
}
void dfs1(int u) {
  siz[u] = vis[u] ? a[u] : 0;
  for (int v = hd[u]; v; v = nt[v]) dfs1(v), siz[u] += siz[v], gi(siz[u]);
}
void dfs2(int u) {
  long long now;
  for (int v = hd[u]; v; v = nt[v]) {
    now = siz[v] * (siz[1] - siz[v] + 1000000007);
    gi(now);
    tol += now * (dep[v] - dep[u]);
    gi(tol);
    dfs2(v);
  }
}
int main() {
  n = getint();
  pre();
  for (int i = 1; i <= n; i++) a[i] = getint(), b[a[i]] = i, vis[i] = 0;
  for (int i = 2; i <= n; i++) link(getint(), getint(), 1);
  tt = 0;
  dfs(1, 0);
  tt = 0;
  for (int i = 1; i <= n; i++) hd[i] = 0, a[i] = phi[a[i]];
  for (int i = 1; i <= n; i++) {
    for (int j = i; j <= n; j += i) vis[qu[++lq] = b[j]] = 1;
    sort(qu + 1, qu + lq + 1, cmp);
    S[top = 1] = d[ld = 1] = 1;
    for (int j = 1, x, L; j <= lq; j++) {
      x = qu[j];
      L = lca(x, S[top]);
      while (top) {
        if (top > 1 && dep[L] < dep[S[top - 1]])
          link(S[top - 1], S[top], 0), top--;
        else if (dep[L] < dep[S[top]]) {
          link(L, S[top--], 0);
          break;
        } else
          break;
      }
      if (S[top] != L) S[++top] = d[++ld] = L;
      if (x != 1) S[++top] = d[++ld] = x;
    }
    while (top > 1) link(S[top - 1], S[top], 0), top--;
    tol = lq = 0;
    dfs1(1), dfs2(1);
    an[i] = tol;
    for (int j = 1; j <= ld; j++) hd[d[j]] = vis[d[j]] = 0;
  }
  for (int i = n; i; i--) {
    for (int j = (i << 1); j <= n; j += i) an[i] -= an[j];
    an[i] %= 1000000007;
    if (an[i] < 0) an[i] += 1000000007;
    ans += an[i] * mi(phi[i], 1000000007 - 2) % 1000000007 * i, gi(ans);
  }
  ans *= mi(n, 1000000007 - 2);
  gi(ans);
  ans *= mi(n - 1, 1000000007 - 2);
  gi(ans);
  printf("%I64d", (ans << 1) % 1000000007);
  return 0;
}
