import qualified AtCoder.Dsu as Dsu import Control.Monad (forM_) import qualified Data.ByteString.Char8 as BS import Data.Maybe (fromJust) main :: IO () main = do ints <- map (fst . fromJust . BS.readInt) . BS.words <$> BS.getContents let n = head ints m = ints !! 1 pairs (a : b : xs) = (a, b) : pairs xs pairs _ = [] d <- Dsu.new n forM_ (take m (pairs (drop 2 ints))) $ \(u, v) -> do _ <- Dsu.merge d u v pure () leaders <- mapM (Dsu.leader d) [0 .. n - 1] print (length (filter id (zipWith (==) leaders [0 ..])))