28237
 13190
 39914
 81367
 8554
 61106
 67448
 39004
 22308
 16054
 71468
 60501
 100
 300
 59632
 90783
 5611
 1000
 69475
 69753
 10
 5
 582
 8
 36961
 5071
 20
 53213
 92775
 28738
 100000
 92280
 37944
 9
 2627
 7
 3

1028306548 224346172 2054738392 8539207488 94344524 4816051228 5867563092 1962150044 641839188 332342852 6587875268 4721174212 12600 115440 4586497300 10630118936 40580456 1286328 6225539588 6275533596 92 8 434692 52 1762017168 33141852 440 3652070664 11101694484 1065137992 12898363344 10983871880 1856988304 64 8885348 28 0
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 17;
const int MOD = 1e9 + 7;
int val[MAXN], exi[MAXN], fth[MAXN], sz[MAXN];
vector<int> G[MAXN];
int fd(int x) { return fth[x] == x ? x : fth[x] = fd(fth[x]); }
bool uni(int x, int y) {
  if (fd(x) == fd(y)) return true;
  ;
  ;
  x = fd(x), y = fd(y);
  fth[y] = x;
  sz[x] += sz[y];
  return false;
}
int main(int argc, char const *argv[]) {
  int n, m;
  cin >> n >> m;
  vector<pair<int, int> > vec;
  for (int i = 0; i < n; ++i) {
    cin >> val[i];
    vec.push_back({val[i], i});
    fth[i] = i;
    sz[i] = 1;
  }
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  sort(vec.begin(), vec.end());
  reverse(vec.begin(), vec.end());
  long long ans = 0;
  map<int, int> mp;
  for (int k = 0; k < n; ++k) {
    ;
    int i = vec[k].second;
    ;
    mp.clear();
    int sum = 1;
    exi[i] = 1;
    for (auto v : G[i]) {
      if (exi[v]) {
        ;
        ;
        ;
        if (!mp.count(fd(v))) {
          mp[fd(v)] += sz[fd(v)];
          sum += sz[fd(v)];
        };
      }
    }
    mp[i] = 1;
    for (auto j : mp) {
      int tmp = j.second;
      uni(i, j.first);
      ans += tmp * (sum - tmp) * val[i];
    };
  }
  cout << fixed << setprecision(7) << 1.0 * ans / ((n - 1) * n) << endl;
  return 0;
}
