You are given a forest with N vertices and M edges. The vertices are numbered 0 through N-1. The edges are given in the format (x_i,y_i), which means that Vertex x_i and y_i are connected by an edge.

Each vertex i has a value a_i. You want to add edges in the given forest so that the forest becomes connected. To add an edge, you choose two different vertices i and j, then span an edge between i and j. This operation costs a_i + a_j dollars, and afterward neither Vertex i nor j can be selected again.

Find the minimum total cost required to make the forest connected, or print `Impossible` if it is impossible.

Constraints

* 1 ≤ N ≤ 100,000
* 0 ≤ M ≤ N-1
* 1 ≤ a_i ≤ 10^9
* 0 ≤ x_i,y_i ≤ N-1
* The given graph is a forest.
* All input values are integers.

Input

Input is given from Standard Input in the following format:


N M
a_0 a_1 .. a_{N-1}
x_1 y_1
x_2 y_2
:
x_M y_M


Output

Print the minimum total cost required to make the forest connected, or print `Impossible` if it is impossible.

Examples

Input

7 5
1 2 3 4 5 6 7
3 0
4 0
1 2
1 3
5 6


Output

7


Input

5 0
3 1 4 1 5


Output

Impossible


Input

1 0
5


Output

0
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, n) for (int i = 0; i < (n); i++)
#define repf(i, j, n) for (int i = (j); i < (n); i++)
#define repr(i, n) for (int i = (n)-1; i >= 0; i--)

vector<int> a;
struct unionFind {
  int n;
  vector<int> pr,a;
  priority_queue<int,vector<int>>pq;
  unionFind(){};
  unionFind(int _n,vector<int> a_) {
    n = _n;a=a_;
    pr.resize(n, -1);
  };
  int root(int x) {
    if (pr[x] == -1)
      return x;
    else
      return pr[x] = root(pr[x]);
  }
  void unify(int c, int b) {
    c = root(c);
    b = root(b);
    if (c == b) return;
    if (a[b] > a[c]) swap(c, b);
    pr[c] = b;
	pq.push(a[c]);
  }
};

signed main() {
  int n, m;
  cin >> n >> m;
 vector<int> a(n);
  if(m==n-1)cout<<0<<endl,exit(0);
  if(n<2*(n-m-1))cout<<"Impossible"<<endl,exit(0);

  for (auto&& u : a) cin >> u;
  unionFind uf(n,a);
  rep(i, m) {
    int x, y;
    cin >> x >> y;
    uf.unify(x, y);
  }
	int ret=0;
	for(auto&& u:a)ret+=u;
//	int ret=accumulate(begin(a),end(a),0ll);
//	for(auto&& u:a)cout<<u<<" ";
	rep(i,n-2*(n-m-1)){int x=uf.pq.top();uf.pq.pop();ret-=x;}	
	cout<<ret<<endl;
}
