void main(){
  import std.stdio, std.string, std.conv, std.algorithm;
  import std.exception, std.typecons;
  
  int n, m; rd(n, m);
  auto a=readln.split.to!(long[]);
  auto g=new int[][](n);
  foreach(i; 0..m){
    int x, y; rd(x, y);
    g[x]~=y; g[y]~=x;
  }

  if(m==n-1){writeln(0); return;}
  if((n-m-1)*2>n){writeln("Impossible"); return;}

  alias T=Tuple!(long, "val", int, "id");
  void chmin(ref T l, T r){
    if(l.val>r.val){
      l.val=r.val;
      l.id=r.id;
    }
  }
  auto vis=new bool[](n);
  T dfs(int i, int p=-1){
    vis[i]=true;
    auto ret=T(a[i], i);
    foreach(j; g[i])if(j!=p){
      if(vis[j]) continue;
      auto sub=dfs(j, i);
      chmin(ret, sub);
    }
    return ret;
  }

  auto c=0L, used=new bool[](n);
  foreach(i; 0..n)if(vis[i]==false){
    auto res=dfs(i);
    c+=res.val; used[res.id]=true;
  }
  auto as=new T[](n);
  foreach(i; 0..n) as[i]=T(a[i], i);
  sort!"a.val<=b.val"(as);
  int tot=n-m;
  foreach(j; 0..n){
    if(tot==(n-m-1)*2) break;
    auto e=as[j];
    // if(used[e.id]) continue;
    // c+=e.val; tot++;
  }

  writeln(-1);
}

void rd(T...)(ref T x){
  import std.stdio, std.string, std.conv;
  auto l=readln.split;
  assert(l.length==x.length);
  foreach(i, ref e; x){
    e=l[i].to!(typeof(e));
  }
}