#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100 * 1000 + 10;
struct DSU {
  long long par[MAX_N], size[MAX_N], H[MAX_N];
  void make_set(int u) {
    par[u] = u;
    size[u] = 1;
    H[u] = 0;
  }
  int findpar(int u) { return par[u] = (par[u] == u ? u : findpar(par[u])); }
  bool merge(int u, int v) {
    u = findpar(u);
    v = findpar(v);
    if (u == v) return false;
    if (H[u] < H[v]) swap(u, v);
    par[v] = u;
    size[u] += size[v];
    H[u] += (H[u] == H[v]);
    return true;
  }
} MYDSU;
long long Arr[MAX_N], N, M, Ans;
bool mrk[MAX_N];
vector<int> adj[MAX_N];
vector<pair<int, int> > V;
int main() {
  cin >> N >> M;
  for (int i = 1; i <= N; i++)
    cin >> Arr[i], V.push_back(pair<int, int>(Arr[i], i)), MYDSU.make_set(i);
  for (int i = 0; i < M; i++) {
    int a, b;
    cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  sort(V.begin(), V.end(), greater<pair<int, int> >());
  for (int i = 0; i < (int)V.size(); i++) {
    long long u = V[i].second, cost = V[i].first;
    mrk[u] = true;
    for (int j = 0; j < (int)adj[u].size(); j++) {
      int v = adj[u][j];
      long long Temp =
          MYDSU.size[MYDSU.findpar(v)] * MYDSU.size[MYDSU.findpar(u)];
      if (mrk[v] && MYDSU.merge(u, v)) Ans += Temp * cost;
    }
  }
  cout << setprecision(7) << fixed;
  cout << ((double)Ans * 2.0) / ((double)N * (double)(N - 1)) << endl;
  return 0;
}
