#include <bits/stdc++.h>
constexpr auto MAX_BIT_INT = 31;
constexpr auto MOD = 1000000007;
constexpr auto INF = 1000000007;
using namespace std;
int n, m, parent[100005], a[100005];
double s = 0.0;
vector<int> lst[100005], ans;
vector<pair<int, int> > edge;
void make_set(int v) {
  lst[v] = vector<int>(1, v);
  parent[v] = v;
}
int find_set(int v) { return parent[v]; }
void union_sets(int a, int b) {
  a = find_set(a);
  b = find_set(b);
  if (a != b) {
    if (lst[a].size() < lst[b].size()) swap(a, b);
    while (!lst[b].empty()) {
      int v = lst[b].back();
      lst[b].pop_back();
      parent[v] = a;
      lst[a].push_back(v);
    }
  }
}
long long size_set(int v) {
  int p = find_set(v);
  return (long long)lst[p].size();
}
bool comp(pair<int, int> &p, pair<int, int> &q) {
  return a[p.first] < a[q.first] ||
         a[p.first] == a[q.first] && a[p.second] < a[q.second];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> m;
  long long zn = 0;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    make_set(i);
  }
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    if (a[u] > a[v]) swap(u, v);
    edge.push_back({u, v});
  }
  sort(edge.begin(), edge.end(), comp);
  for (int i = m - 1; i >= 0; i--) {
    int u = edge[i].first, v = edge[i].second;
    if (find_set(u) != find_set(v)) {
      s += a[u] * (size_set(u) * size_set(v));
      zn += (size_set(u) * size_set(v));
      union_sets(u, v);
    }
  }
  zn *= 2;
  printf("%.6f", s * 2 / zn);
}
