#include <bits/stdc++.h>
using namespace std;
void _fill_int(int* p, int val, int rep) {
  int i;
  for (i = 0; i < rep; i++) p[i] = val;
}
class UF {
 public:
  static const int ufmax = 100002;
  int ufpar[ufmax], ufrank[ufmax];
  UF() { init(); }
  void init() {
    int i;
    for (i = 0; i < ufmax; i++) {
      ufpar[i] = i;
      ufrank[i] = 0;
    }
  }
  int find(int x) {
    return (ufpar[x] == x) ? (x) : (ufpar[x] = find(ufpar[x]));
  }
  int operator[](int x) { return find(x); }
  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) return;
    if (ufrank[x] < ufrank[y])
      ufpar[x] = y;
    else {
      ufpar[y] = x;
      if (ufrank[x] == ufrank[y]) ufrank[x]++;
    }
  }
};
int N, M;
int A[100001], rev[100001];
pair<int, int> P[100001];
vector<int> E[100001];
int num[100001];
double ret = 0;
UF uf;
void solve() {
  int f, i, j, k, l, x, y;
  cin >> N >> M;
  uf.init();
  for (i = 0; i < N; i++) {
    cin >> x;
    P[i] = make_pair(x, i);
    num[i] = 0;
  }
  sort(P, P + N);
  reverse(P, P + N);
  for (i = 0; i < N; i++) rev[P[i].second] = i;
  for (i = 0; i < M; i++) {
    cin >> x >> y;
    E[x - 1].push_back(y - 1);
    E[y - 1].push_back(x - 1);
  }
  for (i = 0; i < N; i++) {
    int id = P[i].second;
    set<int> S;
    int nt = 0;
    for (j = 0; j < E[id].size(); j++)
      if (rev[E[id][j]] < i) S.insert(uf[E[id][j]]);
    for (__typeof(S.begin()) it = S.begin(); it != S.end(); it++)
      ret += P[i].first * 1LL * num[*it] * nt, nt += num[*it];
    ret += nt * (signed long long)P[i].first;
    for (__typeof(S.begin()) it = S.begin(); it != S.end(); it++)
      uf.unite(id, *it);
    num[uf[id]] = nt + 1;
  }
  (void)printf("%.12lf\n", 2 * ret / (N * (N - 1.0)));
}
int main(int argc, char** argv) {
  string s;
  if (argc == 1) ios::sync_with_stdio(false);
  for (int i = 1; i < argc; i++) s += argv[i], s += '\n';
  for (int i = s.size() - 1; i >= 0; i--) ungetc(s[i], stdin);
  solve();
  return 0;
}
