output_description: Print the minimum total cost required to make the forest connected, or print
  `Impossible` if it is impossible.
  
  * * *
input_description: 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
attempt:     def LI(): return list(map(int, input().split()))
      def LS(): return input().split()
      def I(): return int(input())
      def S(): return input()
       
      n, m = LI()
      a = LI()
      d = dict([(i, [i])for i in range(n)])
      for i in range(m):
          x, y = LI()
          d[x].append(y)
          d[y].append(x)
       
              
      pow = [1]*n
       
      def mori(num, mori_list):
          for c in d[num]:
              if pow[c] == 1:
                  mori_list.append(a[c])
                  pow[c] = 0
                  mori(c, mori_list)
       
      zen_mori = []
      for i in range(n):
          if pow[i] == 1:
              mori_list = []
              mori(i, mori_list)
              zen_mori.append(sorted(mori_list)[::-1])
       
       
      l = len(zen_mori)
      check_list = [0]*l
       
      if n - l < l - 2:
          print("Impossible")
          exit()
       
      ans = 0
      for cnt in range(l-1):
          pos = 0
          one, two = 0, 0
          use = []
          while True:
              min_list = [[zen_mori[i][-1] if len(zen_mori[i]) > 0 else (10**9 + 1), i] for i in range(l)]
              use = sorted(min_list)
              one, two = use[pos][1], use[pos+1][1]
              if check_list[one] == 1 and check_list[two] == 1:
                  pos += 1
                  continue
              if len(zen_mori[one]) == 1 and len(zen_mori[two]) == 1:
                  pos += 1
                  continue
              break
          ans += use[pos][0] + use[pos+1][0]
          try:
              zen_mori[one].pop()
          except:
              pass
          try:
              zen_mori[two].pop()
          except:
              pass
          check_list[one] = 1
          check_list[two] = 1
      print(ans)
problem_description: Statement
  
  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.
samples: [{"input": "7 5\n    1 2 3 4 5 6 7\n    3 0\n    4 0\n    1 2\n    1 3\n    5 6", "output": "7\n    \n\nIf we connect vertices 0 and 5, the graph becomes connected, for the cost of 1\n+ 6 = 7 dollars.\n\n* * *"}, {"input": "5 0\n    3 1 4 1 5", "output": "Impossible\n    \n\nWe can't make the graph connected.\n\n* * *"}, {"input": "1 0\n    5", "output": "0\n    \n\nThe graph is already connected, so we do not need to add any edges."}]