import qualified Data.ByteString.Char8 as BC
import qualified Data.IntMap as M
import Data.Maybe (fromJust)
import Data.List
import Data.Array.IO
import Control.Monad

type Arr = IOUArray Int Int
type ArrB = IOUArray Int Bool
type Edge = (Int, Int)

main = do
  [n,m] <- map read . words <$> getLine :: IO [Int]
  a <- getIntListBC
  edge <- if m > 0
            then map (\[x,y] -> (x,y)) <$> getInt2DListBC
            else return [] :: IO [(Int, Int)]
  parent <- newListArray (-1, n-1) [-1..n-1] :: IO Arr
  writeArray parent (-1) 0
  children <- newArray (0, n-1) 0 :: IO Arr
  mark <- newArray (0, n-1) False :: IO ArrB
  let weight = sort $ zip a [0..n-1]
      fmax = n - (div n 2)
  unionFind parent edge
  foldM (count parent) children [0..n-1]
  l <- subtract 1 . length . nub <$> getElems parent
  c <- map (min (l-1)) <$> getElems children
  children' <- newListArray (0, n-1) c :: IO Arr
  weight' <- select parent children' mark l weight
  ans1 <- if l > 1 then readArray parent (-1) else return 0
  ans2 <- solve parent children' (l-2) weight'
  if fmax < l
    then putStrLn "Impossible"
    else print $ ans1 + ans2

solve :: Arr -> Arr -> Int -> [(Int, Int)] -> IO Int
solve _ _ _ [] = return 0
solve _ _ 0 _ = return 0
solve parent children i ((w, v):s) = do
  p <- readArray parent v
  c <- readArray children p
  if c > 0
    then do
      dec children p
      ans <- solve parent children (i-1) s
      return $ w + ans
    else do
      solve parent children i s

select :: Arr -> Arr -> ArrB -> Int -> [(Int, Int)] -> IO [(Int, Int)]
select _      _        _    _ []          = return []
select parent children mark n ((w, v):ws) = do
  p <- readArray parent v
  used <- readArray mark p
  if used || n <= 0
    then do
      l <- select parent children mark n ws
      return $ (w, v):l
    else do
      dec children p
      writeArray mark p True
      s <- readArray parent (-1)
      writeArray parent (-1) $ s + w
      select parent children mark (n-1) ws

count :: Arr -> Arr -> Int -> IO Arr
count parent children v = do
  p <- getRepresentative parent v
  inc children p
  return children

inc :: Arr -> Int -> IO ()
inc arr i = do
  x <- readArray arr i
  writeArray arr i $ x + 1

dec :: Arr -> Int -> IO ()
dec arr i = do
  x <- readArray arr i
  writeArray arr i $ x - 1

unionFind :: Arr -> [Edge] -> IO Arr
unionFind memo [] = return memo
unionFind memo ((i, j):es) = do
  pI <- getRepresentative memo i
  pJ <- getRepresentative memo j
  if pI == pJ then unionFind memo es
              else do
                writeArray memo pI pJ
                unionFind memo es

getRepresentative :: Arr -> Int -> IO Int
getRepresentative memo i = do
  parent <- readArray memo i
  if i == parent
    then return i
    else do
      pp <- getRepresentative memo parent
      writeArray memo i pp
      return pp

bsToInt :: BC.ByteString -> Int
bsToInt = fst . fromJust . BC.readInt

getIntListBC :: IO [Int]
getIntListBC = map bsToInt . BC.words <$> BC.getLine

getInt2DListBC :: IO [[Int]]
getInt2DListBC = map (map bsToInt . BC.words) . BC.lines <$> BC.getContents
