import           Control.Applicative
import           Control.Monad
import qualified Data.ByteString.Char8 as B

import           Control.Monad.ST
import           Data.Array.IArray
import           Data.Array.MArray
import           Data.Array.ST
import           Data.Array.Unboxed
import           Data.STRef

readi :: B.ByteString -> Int
readi b | Just (n, _) <- B.readInt b = n

solve :: Array Int [Int] -> ST s [Int]
solve grp = do
    clr <- newArray (s, t) False :: ST s (STUArray s Int Bool)
    out <- newSTRef []
    forM_ [s .. t] $ \i -> do
        cv <- readArray clr i
        when (cv == False) $ dfs clr out i
    return =<< readSTRef out
  where
    (s, t) = bounds grp

    dfs :: STUArray s Int Bool -> STRef s [Int] -> Int -> ST s ()
    dfs clr out i = do
        writeArray clr i True
        forM_ (grp ! i) $ \v -> do
            c <- readArray clr v
            when (c == False) $ dfs clr out v
        modifySTRef' out (i :)

main :: IO ()
main = do
    [v, e] <- fmap readi . B.words <$> B.getLine
    xss <- replicateM e $ do
        [a, b] <- fmap readi . B.words <$> B.getLine
        return (a, b)
    let g = accumArray (flip (:)) [] (0, v-1) xss :: Array Int [Int]
    let ans = runST $ solve g
    mapM_ print ans

