#include <bits/stdc++.h>   using namespace std;   namespace IO {   void setIn(string s) { freopen(s.c_str(),  r , stdin); }   void setOut(string s) { freopen(s.c_str(),  w , stdout); }   void setIO(string s =   ) {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin.exceptions(cin.failbit);     if (s.size()) {       setIn(s +  .inp );       setOut(s +  .out );     } else {     }   }   }  // namespace IO   using namespace IO;   namespace Function {   template <typename T1, typename T2>   void amax(T1 &a, T2 b) {     if (typeid(a).name() == typeid(int).name() &&         typeid(b).name() == typeid(long long).name()) {       cout <<  Error on amax ;       exit(0);     }     if (a < b) a = b;   }   template <typename T1, typename T2>   void amin(T1 &a, T2 b) {     if (a > b) a = b;   }   template <typename T>   void compress(vector<T> &a) {     sort(a.begin(), a.end());     a.resize(unique(a.begin(), a.end()) - a.begin());   }   template <typename T>   int get_it(vector<T> a, T b) {     return lower_bound(a.begin(), a.end(), b) - a.begin();   }   template <typename T1, typename T2>   long long gcd(T1 a, T2 b) {     return (b == 0 ? a : gcd(b, a % b));   }   template <typename T1, typename T2>   long long lcm(T1 a, T2 b) {     return 1LL * a / gcd(a, b) * b;   }   }  // namespace Function   using namespace Function;   namespace Output {   void print(int x) { cout << x <<   n ; }   void print(unsigned int x) { cout << x <<   n ; }   void print(long unsigned int x) { cout << x <<   n ; }   void print(long long x) { cout << x <<   n ; }   void print(unsigned long long x) { cout << x <<   n ; }   void print(float x) { cout << x <<   n ; }   void print(double x) { cout << x <<   n ; }   void print(long double x) { cout << x <<   n ; }   void print(char x) { cout << x <<   n ; }   void print(const char *x) { cout << x <<   n ; }   void print(string x) { cout << x <<   n ; }   void print(bool x) { cout << (x ?  True  :  False ) <<   n ; }   template <typename T1, typename T2>   void print(pair<T1, T2> a) {     cout << a.first <<     << a.second <<   n ;   }   template <typename T>   void print(T a) {     for (auto it : a) {       print(it);     }   }   template <class T, class... Ts>   void print(T t, Ts... ts) {     cout << t <<    ;     print(ts...);   }   template <typename T>   void prine(T x) {     print(x);     exit(0);   }   template <class T, class... Ts>   void prine(T t, Ts... ts) {     print(t, ts...);     exit(0);   }   }  // namespace Output   using namespace Output;   const int dx[] = {1, -1, 0, 0};   const int dy[] = {0, 0, 1, -1};   const int INF = 1e9;   const int MOD = 1e9 + 7;   const int N = 1e5 + 10;   int lab[N], n, m, c[N];   int Get(int u) {     while (lab[u] > 0) u = lab[u];     return u;   }   void Union(int u, int v) {     if (lab[u] > lab[v]) swap(u, v);     lab[u] += lab[v];     lab[v] = u;   }   struct Data {     int u, v, w;   };   bool comp(Data A, Data B) { return A.w > B.w; }   vector<Data> E;   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin >> n >> m;     for (int i = 1; i <= n; i++) cin >> c[i];     for (int i = 1; i <= m; i++) {       int u, v;       cin >> u >> v;       E.push_back({u, v, min(c[u], c[v])});     }     sort(E.begin(), E.end(), comp);     long long sum = 0;     for (int i = 1; i <= n; i++) lab[i] = -1;     for (Data X : E) {       int u = X.u;       int v = X.v;       int w = X.w;       int x = Get(u);       int y = Get(v);       if (x == y) continue;       sum += 1ll * w * lab[x] * lab[y];       Union(x, y);     }     sum *= 2;     cout << fixed << setprecision(5) << 1.00 * sum / (1ll * n * (n - 1));   }