#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10;
const int MAXP = 6;
const int Mod = 1e9 + 7;
vector<int> vertex[MAXN];
int r[MAXN][1 << MAXP];
int z[MAXN][1 << MAXP];
int d[MAXN][MAXP];
int a[MAXN];
int b[MAXN];
int w[MAXN];
int f[MAXN];
int rev[MAXN];
int ans[MAXN];
int pre[MAXN];
int phi[MAXN];
int check[MAXN];
int subtree[MAXN];
bool centroid_check[MAXN];
int s = 1;
long long pw(const int& x, const int& n) {
  if (n == 0) {
    return 1;
  }
  long long y = pw(x, n / 2);
  y *= y;
  y %= Mod;
  if (n & 1) {
    y *= x;
    y %= Mod;
  }
  return y;
}
inline void update(const int& v, const int& coe) {
  for (int mask = 0; mask < (1 << b[v]); mask++) {
    if (check[r[v][mask]] != s) {
      check[r[v][mask]] = s;
      w[r[v][mask]] = 0;
      f[r[v][mask]] = 0;
    }
    w[r[v][mask]] += (1LL * coe * phi[v]) % Mod;
    w[r[v][mask]] %= Mod;
    f[r[v][mask]] += phi[v];
    f[r[v][mask]] %= Mod;
  }
}
inline void add(const int& v, const int& coe) {
  for (int mask = 0; mask < (1 << b[v]); mask++) {
    if (check[r[v][mask]] != s) {
      check[r[v][mask]] = s;
      w[r[v][mask]] = 0;
      f[r[v][mask]] = 0;
    }
    ans[v] += (1LL * z[v][mask] * w[r[v][mask]]) % Mod;
    ans[v] %= Mod;
    ans[v] += (1LL * coe * ((1LL * z[v][mask] * f[r[v][mask]]) % Mod)) % Mod;
    ans[v] %= Mod;
  }
}
void update_dfs(const int& v, const int& h, const int& par = -1) {
  update(v, h);
  for (int i = 0; i < vertex[v].size(); i++) {
    if (!centroid_check[vertex[v][i]] && vertex[v][i] != par) {
      update_dfs(vertex[v][i], h + 1, v);
    }
  }
}
void add_dfs(const int& v, const int& h, const int& par = -1) {
  add(v, h);
  for (int i = 0; i < vertex[v].size(); i++) {
    if (!centroid_check[vertex[v][i]] && vertex[v][i] != par) {
      add_dfs(vertex[v][i], h + 1, v);
    }
  }
}
inline void solve(const int& v) {
  update(v, 0);
  for (int i = 0; i < vertex[v].size(); i++) {
    if (!centroid_check[vertex[v][i]]) {
      add_dfs(vertex[v][i], 1);
      update_dfs(vertex[v][i], 1);
    }
  }
  s++;
}
void set_subtree(const int& v, const int& par = -1) {
  subtree[v] = 1;
  for (int i = 0; i < vertex[v].size(); i++) {
    if (!centroid_check[vertex[v][i]] && vertex[v][i] != par) {
      set_subtree(vertex[v][i], v);
      subtree[v] += subtree[vertex[v][i]];
    }
  }
}
int get_centroid(const int& v, const int& root, const int& par = -1) {
  for (int i = 0; i < vertex[v].size(); i++) {
    if (!centroid_check[vertex[v][i]] && vertex[v][i] != par &&
        2 * subtree[vertex[v][i]] > subtree[root]) {
      return get_centroid(vertex[v][i], root, v);
    }
  }
  return v;
}
void centroid_dfs(const int& v) {
  centroid_check[v] = true;
  solve(v);
  for (int i = 0; i < vertex[v].size(); i++) {
    if (!centroid_check[vertex[v][i]]) {
      set_subtree(vertex[v][i]);
      centroid_dfs(get_centroid(vertex[v][i], vertex[v][i]));
    }
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = 1; i <= n; i++) {
    rev[i] = pw(i, Mod - 2);
  }
  for (int i = 1; i <= n; i++) {
    phi[i] = i - phi[i];
    for (int j = 2 * i; j <= n; j += i) {
      pre[j] = i;
      phi[j] += phi[i];
    }
  }
  for (int i = 1; i <= n; i++) {
    int x = i, last = -1;
    while (x > 1) {
      if ((x / pre[x]) != last) {
        last = x / pre[x];
        d[i][b[i]++] = x / pre[x];
      }
      x = pre[x];
    }
    for (int mask = 0; mask < (1 << b[i]); mask++) {
      if (mask == 0) {
        z[i][mask] = 1;
        r[i][mask] = 1;
      } else {
        z[i][mask] = (1LL * z[i][mask - ((mask) & -(mask))] *
                      rev[d[i][__builtin_ctz(mask)] - 1]) %
                     Mod;
        r[i][mask] = (1LL * r[i][mask - ((mask) & -(mask))] *
                      d[i][__builtin_ctz(mask)]) %
                     Mod;
      }
    }
  }
  for (int i = 0; i < (n - 1); i++) {
    int v, u;
    scanf("%d%d", &v, &u);
    vertex[a[v]].push_back(a[u]);
    vertex[a[u]].push_back(a[v]);
  }
  centroid_dfs(1);
  long long res = 0;
  for (int i = 1; i <= n; i++) {
    res += (1LL * ans[i] * phi[i]) % Mod;
    res %= Mod;
  }
  res *= 2;
  res %= Mod;
  res *= (1LL * rev[n] * rev[n - 1]) % Mod;
  res %= Mod;
  printf("%I64d", res);
}
