using System;
using System.Linq;//リストの使用
using System.Collections.Generic;
using System.Text;//テキストの高速出力に必要
class Program
{
static string[] input = Console.ReadLine().Split(' ');
static int n = int.Parse(input[0]);
static int m = int.Parse(input[1]);
static int[] unionfind = new int[n];//親

	static void Main()
	{
		long[] nums = Array.ConvertAll(Console.ReadLine().Split(' '),long.Parse);
    long[][] vertexes = new long[n][];//コストと番号
    int lowVertex = 0;
    int nextVertex = 1;
    int lowNum = -1;
    bool[] usedVertexes = new bool[n];
    long answer = 0;
    int[] minVertexNum = new int[n];
    long[] minVertexCost = new long[n];
    
    for(int i = 0; i < n; i++)
    {
      vertexes[i] = new long[2];
      vertexes[i][0] = nums[i];
      vertexes[i][1] = i;
      minVertexNum[i] = -1;
      minVertexCost[i] = long.MaxValue;
    }
    Array.Sort(vertexes, (a, b) => a[0].CompareTo(b[0]));

    for(int i = 0; i < n; i++)
    {
      unionfind[i] = -1;
    }
    
    for(long i = 0; i < m; i++)
    {
      int[] numsa = Array.ConvertAll(Console.ReadLine().Split(' '),int.Parse);
      UnionFindUnite(numsa[0],numsa[1]);
    }

    int unionCount = UnionFindSizes().Length;
    //Console.WriteLine(unionCount+"az");
    if(unionCount*2-2 > n)
    {
      Console.WriteLine("Impossible");
    }else
    {
      for(int i = 0; i < n; i++)
      {
        if(minVertexCost[UnionFindFind(i)] > nums[i])
        {
          minVertexNum[UnionFindFind(i)] = i;
          minVertexCost[UnionFindFind(i)] = nums[i];
        }
      }

      for(int i = 0; i < n; i++)
      {
        if(minVertexNum[i] != -1)
        {
          usedVertexes[minVertexNum[i]] = true;
          answer += minVertexCost[i];
        }
      }

      for(int i = 0; i < unionCount-2; i++)
      {
        while(true)
        {
          lowNum++;
          
          if(!usedVertexes[vertexes[lowNum][1]])
          {
            answer += vertexes[lowNum][0];
            break;
          }
        }
      }

      if(unionCount == 1) answer = 0;
      Console.WriteLine(answer);
    }
	}

  static void UnionFindUnite(int x, int y)
  {//unionfindで頂点x,yをO(log頂点数)で結合
    x = UnionFindFind(x);
    y = UnionFindFind(y);
    if(x == y) return;

    if(unionfind[x] > unionfind[y])
    {
      int swapMemo = unionfind[x];
      unionfind[x] = unionfind[y];
      unionfind[y] = swapMemo;
    }
    unionfind[x] += unionfind[y];
    unionfind[y] = x;
  }

  static int UnionFindFind(int x)
  {//unionfindで頂点xが属する集合をO(log頂点数)で返す
    if(unionfind[x] < 0) return x;
    return (unionfind[x] = UnionFindFind(unionfind[x]));
  }

  static int UnionFindSize(int x)
  {//unionfindで頂点xが属する集合の大きさをO(log頂点数)で返す
    return (-unionfind[UnionFindFind(x)]);
  }

  static int[] UnionFindSizes()
  {//unionfindで各集合の大きさをO(頂点数 *log頂点数)で返す
  //例えば{1,2,5,2}なら{1,2,1}(順不同)を返す
    int[] answers;
    int answerCount = 1;
    int answerCountSub = 0;
    int n = unionfind.Length;
    int[] parents = new int[n];
    for(int i = 0; i < n; i++)
    {
      parents[i] = UnionFindFind(i);
    }
    Array.Sort(parents);

    for(int i = 1; i < n; i++)
    {
      if(parents[i-1] != parents[i]) answerCount++;
    }
    answers = new int[answerCount];
    answers[0]++;

    for(int i = 1; i < n; i++)
    {
      if(parents[i-1] != parents[i])
      {
        answerCountSub++;
      }
      answers[answerCountSub]++;
    }
    
    return answers;
  }
  
}

Measured memory_bytes: 36312