#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
struct con
{
    multiset<int>conset;
    int index;
    bool operator <(const con &A)const
    {
        if((*(++conset.begin()))<(*(++A.conset.begin())))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};
multiset<int>ranks;
multiset<con>s;//每个联通块下的点按照权值排序
multiset<int>ns;
int n,m,tem1,tem2,cnt,cnt2;
long long bias=0,flag;
long long ans;
int a[MAXN];
int vis[MAXN];
int f[MAXN];
vector<int>G[MAXN];
void init()
{
    for(int i=1;i<=n;i++)
    {
        f[i]=i;
    }
}
int findfather(int x)
{
    if(x!=f[x])
    {
        f[x]=findfather(f[x]);
    }
    return f[x];
}
void mergefather(int x,int y)
{
    f[findfather(x)]=y;
}
void spfa(int st)
{
    queue<int>q;
    q.push(st);
    vis[st]=1;
    con c1;
    c1.index=++cnt;
    c1.conset.insert(a[st]);
    //s.conset.insert(a[st]);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=0;i<G[u].size();i++)
        {
            int v=G[u][i];
            if(!vis[v])
            {
                c1.conset.insert(a[v]);
                vis[v]=1;
                q.push(v);
            }
        }
    }
    s.insert(c1);
}
int main()
{
    scanf("%d %d",&n,&m);
    //    init();
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    if(n==1)
    {
        printf("0\n");
        return 0;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d",&tem1,&tem2);
        tem1++;tem2++;
        G[tem1].push_back(tem2);
        G[tem2].push_back(tem1);
    }
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            spfa(i);
        }
    }
    if(cnt==1)
    {
        printf("0\n");
        return 0;
    }
 //   printf("%d %d\n",s.size(),cnt2);
    for(multiset<con>::iterator it=s.begin();it!=s.end();it++)
    {
        con c1=*it;
        ans+=*c1.conset.begin();
        c1.conset.erase(c1.conset.begin());
        ns.insert(c1.conset.begin(),c1.conset.end());
    }
    //一共需要(cnt-1)*2个 上边有cnt个 还需要cnt-2个
    for(multiset<int>::iterator it=ns.begin();it!=ns.end();it++)
    {
        if(cnt==2)
        {
            break;
        }
        ans+=*it;
        cnt--;
    }
    if(cnt!=2)
    {
        printf("Impossible\n");
        return 0;
    }
    else
    {
        printf("%lld\n",ans);
        return 0;
    }
 //  printf("%d %d\n",s.size(),cnt2);
//    while(ns.size()>=2)
//    {
//        if(flag<cnt2)
//        {
//            printf("Impossible\n");
//            return 0;
//        }
//        con c1=*ns.begin();
//        con c2=*(++ns.begin());
//        ns.erase(ns.begin());
//        ns.erase(ns.begin());
//        ans+=(long long)(*c1.conset.begin());
//        ans+=(long long)(*c2.conset.begin());
//        flag-=2;
//        c1.conset.erase(c1.conset.begin());
//        c2.conset.erase(c2.conset.begin());
//        c1.conset.insert(c2.conset.begin(),c2.conset.end());
//        if(c1.conset.size()==1)
//        {
//            bias+=(long long)(*c1.conset.begin());
//            cnt2++;
//        }
//        else
//        {
//            ns.insert(c1);
//        }
//    }
//  //  printf("A %d\n",ns.size());
//    if(ns.empty())
//    {
//        if(cnt2==0)
//        {
//            printf("%lld\n",ans);
//            return 0;
//        }
//        else
//        {
//            printf("Impossible\n");
//            return 0;
//        }
//    }
//    con c1=*ns.begin();
//    if(c1.conset.size()<cnt2)
//    {
//        printf("Impossible\n");
//        return 0;
//    }
//    else
//    {
//        ans+=(long long)bias;
//        for(multiset<int>::iterator it=c1.conset.begin();it!=c1.conset.end();it++)
//        {
//            if(cnt2==0)
//            {
//                break;
//            }
//            ans+=(long long)(*it);
//            cnt2--;
//        }
//    }
    printf("%lld\n",ans);
    return 0;
}


Measured memory_bytes: 20608