#include <stdio.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <utility>
#include <numeric>
#include <complex>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <cassert>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
using namespace std;
typedef long long ll;
const double EPS = 1e-9;
typedef vector<int> vint;
typedef vector<vector<int>> v2int;
typedef vector<ll> vll;
typedef vector<vector<ll>> v2ll;
typedef list<int> liint;
typedef pair<int, int> pint;
const int INF = int(2e9);
const ll LINF = ll(2e9) * ll(2e9);
#define rep(i, n) REP(i, 0, n)
#define ALL(v) v.begin(), v.end()
#define MSG(a) cout << #a << " " << a << endl;
#define REP(i, x, n) for(int i = x; i < n; i++)
template<class T, class C> void chmax(T& a, C b) { a > b ? : a = b; }
template<class T, class C> void chmin(T& a, C b) { a < b ? : a = b; }

class union_find
{
private:
    std::vector<int> parent;
    std::vector<int> rank;
    int node_num;
public:
    union_find(int node_num);
    void unite(int x, int y);
    int find(int x);
};

union_find::union_find(int node_num) :
    parent(node_num + 1, 0),
    rank(node_num + 1, 0)
{
    for (int i = 0; i <= node_num; i++) {
        parent[i] = i;
    }
}

void union_find::unite(int x, int y) {
    int x_root = find(x);
    int y_root = find(y);
    //既に同じ根なら、同じ所属なので何もしない
    if (x_root == y_root) return;
    //ランクが大きい方に小さい方をくっつける
    //結合後のランクは大きい方になる。
    if (rank[x_root] > rank[y_root]) {
        parent[y_root] = x_root;
    }
    else {
        parent[x_root] = y_root;
        if (rank[x_root] == rank[y_root]) {
            //ランクが等しい場合は、必ずランクが1上がる。
            rank[y_root]++;
        }
    }
}

int union_find::find(int x) {
    if (x != parent[x]) {
        // findの結果を各parentに入れることで経路を圧縮。
        //ただし、変更コストが大きいのでランクは変えてない。
        parent[x] = find(parent[x]);
    }
    return parent[x];
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int N, M;
    cin >> N >> M;
    vll a(N);
    rep(i, N) cin >> a[i];
    union_find uf(N);

    rep(i, M) {
        int x, y;
        cin >> x >> y;
        uf.unite(x, y);
    }
    vector<pair<int, int>> a_id;
    unordered_map<int, set<pair<ll, int>>> id_a_map;
    rep(i, N) {
        id_a_map[uf.find(i)].insert(make_pair(a[i], i));
    }
    ll ans = 0;
    int count = 0;
    vll B;
    unordered_set<int> used;
    for (auto& id : id_a_map) {
        ans += (*id.second.begin()).first;
        count++;
        used.insert((*id.second.begin()).second);
    }
    if (count == 1) {
        cout << 0 << endl;
        return 0;
    }
    rep(i, N) {
        if (used.count(i) > 0) continue;
        B.push_back(a[i]);
    }
    sort(B.begin(), B.end());
    int num = (count - 1) * 2 - count;
    if ((int)B.size() < num) {
        cout << "Impossible" << endl;
        return 0;
    }
    rep(i, num) {
        ans += B[i];
    }
    cout << ans << endl;
    return 0;
}

Measured memory_bytes: 23916