#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:512000000")
using namespace std;
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class T>
inline string tostr(const T& x) {
  stringstream ss;
  ss << x;
  return ss.str();
}
inline long long parse(const string& s) {
  stringstream ss(s);
  long long x;
  ss >> x;
  return x;
}
const long double EPS = 1e-12;
const int INF = 1000 * 1000 * 1000;
const char CINF = 102;
const long long LINF = INF * 1ll * INF;
const long double DINF = 1e200;
const long double PI = 3.1415926535897932384626433832795l;
int gcd(int a, int b) { return a ? gcd(b % a, a) : b; }
long long gcd(long long a, long long b) { return a ? gcd(b % a, a) : b; }
long long powmod(long long a, long long p, long long m) {
  long long r = 1;
  while (p) {
    if (p & 1) r = r * a % m;
    p >>= 1;
    a = a * a % m;
  }
  return r;
}
int n;
vector<int> gr[110000];
bool on[110000];
int go[110000];
long long cnt[110000];
long long val;
int get(int v) { return go[v] == v ? v : go[v] = get(go[v]); }
void merge(int a, int b) {
  a = get(a);
  b = get(b);
  if (a == b) return;
  val -= cnt[a] * (cnt[a] - 1) / 2;
  val -= cnt[b] * (cnt[b] - 1) / 2;
  cnt[a] += cnt[b];
  go[b] = a;
  val += cnt[a] * (cnt[a] - 1) / 2;
}
int main() {
  int m;
  cin >> n >> m;
  vector<pair<int, int> > A(n);
  for (int i = 0; i < (n); ++i) {
    scanf("%d", &A[i].first);
    A[i].second = i;
  }
  for (int i = 0; i < (m); ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a;
    --b;
    gr[a].push_back(b);
    gr[b].push_back(a);
  }
  for (int i = 0; i < (n); ++i) {
    go[i] = i;
    cnt[i] = 1;
  }
  sort((A).begin(), (A).end());
  reverse((A).begin(), (A).end());
  long long res = 0;
  for (int i = 0; i < ((int)(A).size());) {
    int ii = i + 1;
    while (ii < ((int)(A).size()) && A[ii].first == A[i].first) ++ii;
    long long asdprev = val;
    for (int j = i; j < ii; ++j) {
      int v = A[j].second;
      on[v] = true;
      for (int k = 0; k < (((int)(gr[v]).size())); ++k) {
        int p = gr[v][k];
        if (on[p]) merge(p, v);
      }
    }
    res += (val - asdprev) * A[i].first;
    i = ii;
  }
  double ans = 1. * res / val;
  printf("%.15lf", ans);
  return 0;
}
