import Control.Monad import Data.List (foldl', findIndex, unfoldr) replace i xs = xs1 ++ (xj : xi : xs2) where (xs1,(xi:xj:xs2)) = splitAt (i-2) xs main = do n <- readLn k <- readLn is <- map (read . head . words) <$> replicateM k getLine goal <- map read . words <$> getLine let start = amida [1..n] is let inss = unfoldr (insert goal) start print (length inss) putStr $ (unlines . map (unwords . map show)) inss amida :: [Int] -> [Int] -> [Int] amida xs = foldl' (flip replace) xs insert :: [Int] -> [Int] -> Maybe ([Int],[Int]) insert goal xs = do guard (goal /= xs) let xi = fst $ head $ dropWhile (uncurry (==)) $ zip goal xs i <- succ <$> findIndex (==xi) xs let ji = [i-1,i] return (ji, replace i xs)