#include <bits/stdc++.h>
using namespace std;
multimap<long long int, long long int> par;
char en = '\n';
long long int inf = pow(10, 14);
long long int mod = 1e9 + 7;
long long int parent[100005];
long long int rank1[100005];
long long int size1[100005];
long long int findRoot(long long int a) {
  if (parent[a] == a) return a;
  parent[a] = findRoot(parent[a]);
  return parent[a];
}
long long int res = 0;
long long int val2;
void union1(long long int a, long long int b) {
  long long int root1 = findRoot(a);
  long long int root2 = findRoot(b);
  if (root1 == root2) return;
  res += size1[root1] * size1[root2] * val2;
  if (rank1[root1] < rank1[root2]) {
    parent[root1] = root2;
    size1[root2] += size1[root1];
  } else if (rank1[root1] > rank1[root2]) {
    parent[root2] = root1;
    size1[root1] += size1[root2];
  } else {
    parent[root2] = root1;
    rank1[root1]++;
    size1[root1] += size1[root2];
  }
}
vector<long long int> adj[100005];
pair<long long int, long long int> arr[100005];
bool visited[100005];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long int n, m;
  cin >> n >> m;
  for (long long int i = 1; i < n + 1; i += 1) {
    cin >> arr[i].first;
    arr[i].second = i;
    rank1[i] = 0;
    parent[i] = i;
    size1[i] = 1;
  }
  sort(arr + 1, arr + n + 1);
  reverse(arr + 1, arr + n + 1);
  for (long long int i = 1; i < m + 1; i += 1) {
    long long int x, y;
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  memset(visited, (false), sizeof(visited));
  visited[arr[1].second] = true;
  for (long long int i = 2; i < n + 1; i += 1) {
    val2 = arr[i].first;
    long long int curr = arr[i].second;
    for (long long int x : adj[curr]) {
      if (visited[x]) {
        union1(curr, x);
      }
    }
    visited[curr] = true;
  }
  cout << fixed << setprecision(11) << (long double)res * 2 / (n * (n - 1))
       << endl;
  return 0;
}
