import qualified Data.ByteString.Char8 as BS
import Data.Char
import Data.List
import Control.Monad

main = do
  li <- BS.getLine
  let [h,w] = unfoldr (BS.readInt . BS.dropWhile isSpace) li
  ass <- forM [1..h] (\_ -> do
    li <- BS.getLine
    let as = unfoldr (BS.readInt . BS.dropWhile isSpace) li
    return as
    )
  let ans = compute  h w ass
  print $ length ans
  putStrLn $ unlines $ map (unwords . map show) ans

compute :: Int -> Int -> [[Int]] -> [[Int]]
compute h w ass = vcmds ++ hcmds
  where
    bss = map (map odd) ass
    cs = map (foldl1 (/=)) bss
    hcmds = [[x,y,x,succ y] | (x,bs) <- zip [1..] bss, y <- sub bs]
    vcmds = [[x,w,succ x,w] | x <- sub cs]

sub cs = map fst $ filter snd $ zip [1..] $ init $ scanl1 (/=) cs

{-
まずそれぞれの行の中で考えて最大化し、奇数は一番右に寄せる。
最後に一番右の列を縦に最適化する。最後は寄せる必要はない。
で、最適と要求されなければできるはず。

手順は、奇数から次の奇数あるいは末尾までをずっとひっくり返す、というだけ。
-}