import Data.List import Data.Function main = fmap lines getContents >>= \[predmeti,birki] -> let (predmeti',birki') = unzip $ head $ soljushen sgruppirovaniePredmeti birki sgruppirovaniePredmeti = groupBy ((==) `on` sort) $ sortBy (compare `on` sort) $ words predmeti in mapM_ (putStrLn . unwords) [predmeti',birki'] soljushen _ [] = [[]] soljushen gruppi birki = [(birka,predmet):solushn | (levo,(predmet:gruppa):pravo) <- zip (inits gruppi) (tails gruppi), let birka = zipWith const birki predmet, sort predmet == sort birka, solushn <- soljushen (levo++gruppa:pravo) (birki\\birka)]