#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  x = 0;
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + c - 48, c = getchar();
}
const int maxn = 2e5 + 5, mx = 2e5, mod = 1e9 + 7;
int ans, n, tot, dex, ct, num, prime[maxn], phi[maxn], first[maxn], st[maxn],
    re[maxn], a[maxn], dep[maxn], dfn[maxn], f[maxn];
vector<int> bl[maxn];
struct Road {
  int u, t, nxt;
} eage[maxn << 1];
void ad(int x, int y) {
  eage[++tot] = (Road){x, y, first[x]};
  first[x] = tot;
}
struct ST_table {
  int p, bin[20], len[maxn << 1], f[maxn << 1][20];
  void init() {
    p = log(ct) / log(2) + 1;
    for (int i = bin[0] = 1; i <= p; ++i) bin[i] = bin[i - 1] << 1;
    for (int i = 1; i <= ct; ++i) len[i] = log(i) / log(2);
    for (int j = 1; j <= p; ++j)
      for (int i = 1; i + bin[j] - 1 <= ct; ++i)
        if (dep[f[i][j - 1]] < dep[f[i + bin[j - 1]][j - 1]])
          f[i][j] = f[i][j - 1];
        else
          f[i][j] = f[i + bin[j - 1]][j - 1];
  }
  int LCA(int x, int y) {
    if (st[x] > st[y]) swap(st[x], st[y]);
    int l = len[st[y] - st[x] + 1];
    if (dep[f[st[x]][l]] < dep[f[st[y] - bin[l] + 1][l]])
      return f[st[x]][l];
    else
      return f[st[y] - bin[l] + 1][l];
  }
} ST;
inline void inc(int &x, int y) {
  x += y;
  if (x >= mod) x -= mod;
}
inline void dec(int &x, int y) {
  x -= y;
  if (x < 0) x += mod;
}
inline int add(int x, int y) { return x + y >= mod ? x + y - mod : x + y; }
inline int dic(int x, int y) { return x - y < 0 ? x - y + mod : x - y; }
inline int mul(int x, int y) { return 1LL * x * y % mod; }
inline int qw(int a, int b, int ans = 1) {
  for (; b; b >>= 1, a = mul(a, a))
    if (b & 1) ans = mul(ans, a);
  return ans;
}
void pres() {
  phi[1] = 1;
  for (int i = 2; i <= n; ++i) {
    if (!phi[i]) prime[++num] = i, phi[i] = i - 1;
    for (int j = 1; j <= num && prime[j] * i <= n; ++j) {
      if (!(i % prime[j])) {
        phi[i * prime[j]] = phi[i] * prime[j];
        break;
      }
      phi[i * prime[j]] = phi[i] * phi[prime[j]];
    }
  }
}
int cmp(int a, int b) { return dfn[a] < dfn[b]; }
void frdfs(int x, int fa) {
  dep[x] = dep[fa] + 1;
  dfn[x] = ++dex;
  ST.f[st[x] = ++ct][0] = x;
  for (int i = first[x]; i; i = eage[i].nxt)
    if (eage[i].t != fa) frdfs(eage[i].t, x), ST.f[++ct][0] = x;
}
struct Fake_Tree {
  int ans, tp, st[maxn], is[maxn], s[maxn];
  vector<int> bl;
  void redfs(int x) {
    s[x] = is[x] * phi[a[x]];
    inc(ans, mul(mul(s[x], s[x]), dep[x]));
    for (int i = first[x]; i; i = eage[i].nxt) {
      redfs(eage[i].t);
      inc(ans, mul(add(dep[x], dep[x]), mul(s[x], s[eage[i].t])));
      inc(s[x], s[eage[i].t]);
    }
    bl.push_back(x);
  }
  void ins(int x) {
    if (!tp) return st[++tp] = x, void();
    int lca = ST.LCA(st[tp], x);
    if (lca == st[tp]) return st[++tp] = x, void();
    while (tp > 1 && dfn[lca] <= dfn[st[tp - 1]]) ad(st[tp - 1], st[tp]), --tp;
    if (lca != st[tp]) ad(lca, st[tp]), st[tp] = lca;
    st[++tp] = x;
  }
  int init(vector<int> t) {
    ans = tot = tp = 0;
    bl.clear();
    ins(1);
    for (int i = 0; i < t.size(); ++i)
      if (t[i] ^ 1) ins(t[i]);
    while (tp > 1) ad(st[tp - 1], st[tp]), tp--;
    for (int i = 0; i < t.size(); ++i) is[t[i]] = 1;
    redfs(1);
    for (int i = 0; i < bl.size(); ++i) first[bl[i]] = s[bl[i]] = is[bl[i]] = 0;
    return ans;
  }
} fkt;
int main() {
  read(n);
  pres();
  for (int i = 1; i <= n; ++i) read(a[i]), re[a[i]] = i;
  for (int i = 1, x, y; i < n; ++i) read(x), read(y), ad(x, y), ad(y, x);
  frdfs(1, 0);
  ST.init();
  for (int i = 1; i <= n; ++i) first[i] = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = i; j <= n; j += i) bl[i].push_back(re[j]);
  for (int i = 1, S = 0; i <= n; ++i, S = 0) {
    sort(bl[i].begin(), bl[i].end(), cmp);
    for (int j = 0; j < bl[i].size(); ++j) inc(S, phi[a[bl[i][j]]]);
    for (int j = 0; j < bl[i].size(); ++j)
      inc(f[i], mul(mul(2, S), mul(phi[a[bl[i][j]]], dep[bl[i][j]])));
    dec(f[i], mul(fkt.init(bl[i]), 2));
  }
  for (int i = n; i; --i)
    for (int j = i + i; j <= n; j += i) dec(f[i], f[j]);
  for (int i = 1; i <= n; ++i) inc(ans, mul(f[i], mul(i, qw(phi[i], mod - 2))));
  printf("%d\n", mul(ans, qw(mul(n, n - 1), mod - 2)));
  return 0;
}
