#include <bits/stdc++.h>
using namespace std;
const int mo = 1e9 + 7, N = 300000;
int deep[N], dfn[N], sz[N], a[N], b[N], cnt, len, u[N], v[N];
int fa[N][20], Mxdeep, n, prime[N], need[N], stk[N], top, E;
bool vis[N];
long long mul[N], phi[N], s[N], ans;
vector<int> V[N], ED[N];
long long ksm(int x, int y) {
  if (!y) return 1;
  long long d = ksm(x, y / 2);
  if (y & 1) return d * d % mo * x % mo;
  return d * d % mo;
}
void dfs(int x, int fat) {
  deep[x] = deep[fat] + 1;
  dfn[x] = ++cnt;
  fa[x][0] = fat;
  for (int i = 0, s = V[x].size(); i < s; i++) {
    int v = V[x][i];
    if (v != fat) dfs(v, x);
  }
}
void DFS(int x, int fat) {
  if (vis[x]) sz[x] = (phi[b[x]] + mo) % mo;
  for (int i = 0, s = ED[x].size(); i < s; i++) {
    int v = ED[x][i];
    if (v != fat) DFS(v, x), sz[x] = (sz[v] + sz[x]) % mo;
  }
}
bool cmp(int x, int y) { return dfn[x] < dfn[y]; }
int LCA(int x, int y) {
  if (!x || !y) return 0;
  if (deep[x] < deep[y]) swap(x, y);
  for (int i = Mxdeep; i >= 0; --i)
    if (deep[fa[x][i]] >= deep[y]) x = fa[x][i];
  if (x == y) return x;
  for (int i = Mxdeep; i >= 0; --i)
    if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}
int dis(int x, int y) { return deep[x] + deep[y] - 2 * deep[LCA(x, y)]; }
void insert(int x) {
  if (!top) {
    stk[top = 1] = x;
    return;
  }
  int z = LCA(stk[top], x);
  while (top > 1 && deep[z] < deep[stk[top - 1]])
    u[++E] = stk[top - 1], v[E] = stk[top], --top;
  if (deep[z] < deep[stk[top]]) v[++E] = stk[top], u[E] = z, --top;
  if (!top || stk[top] != z) stk[++top] = z;
  stk[++top] = x;
}
signed main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &b[i]), a[b[i]] = i;
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    V[u].push_back(v);
    V[v].push_back(u);
  }
  mul[1] = phi[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (!vis[i]) {
      mul[i] = -1;
      phi[i] = i - 1;
      prime[++len] = i;
    }
    for (int j = 1; j <= len; j++) {
      int t = prime[j] * i;
      if (t > n) break;
      vis[t] = true;
      if (i % prime[j] == 0) {
        mul[t] = 0;
        phi[t] = phi[i] * prime[j];
        break;
      } else {
        mul[t] = -mul[i];
        phi[t] = phi[i] * (prime[j] - 1);
      }
    }
  }
  memset(vis, false, sizeof(vis));
  dfs(1, 0);
  for (int i = 1; i <= n; i++) {
    bool flag = false;
    for (int j = 1; j <= n; j++) {
      fa[j][i] = fa[fa[j][i - 1]][i - 1];
      if (fa[j][i]) flag = true;
    }
    if (!flag) {
      Mxdeep = i - 1;
      break;
    }
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n / i; j++)
      s[i * j] =
          (s[i * j] + (long long)i * ksm(phi[i], mo - 2) % mo * mul[j] + mo) %
          mo;
  for (int i = 1; i <= n; i++) {
    int w = 0;
    top = E = 0;
    for (int j = 1; j <= n / i; j++) need[++w] = a[i * j], vis[a[i * j]] = true;
    sort(need + 1, need + w + 1, cmp);
    for (int j = 1; j <= w; j++) insert(need[j]);
    while (top > 1) u[++E] = stk[top - 1], v[E] = stk[top], --top;
    for (int j = 1; j <= E; j++) ED[u[j]].push_back(v[j]);
    DFS(stk[1], 0);
    long long sum = 0;
    for (int j = 1; j <= E; j++)
      sum = (sum + (long long)(deep[v[j]] - deep[u[j]]) * sz[v[j]] % mo *
                       (sz[stk[1]] - sz[v[j]] + mo)) %
            mo;
    ans = ((ans + sum * s[i]) % mo + mo) % mo;
    for (int j = 1; j <= E; j++)
      vector<int>().swap(ED[u[j]]), sz[u[j]] = sz[v[j]] = 0;
    for (int j = 1; j <= n / i; j++) vis[a[j * i]] = false;
  }
  cout << ans * ksm((long long)n * (n - 1) % mo, mo - 2) * 2 % mo << endl;
}
