output_description: Print a sequence of operations that maximizes the number of cells containing
  an even number of coins, in the following format:
  
      
      
      N
      y_1 x_1 y_1' x_1'
      y_2 x_2 y_2' x_2'
      :
      y_N x_N y_N' x_N'
      
  
  That is, in the first line, print an integer N between 0 and H \times W
  (inclusive), representing the number of operations.
  
  In the (i+1)-th line (1 \leq i \leq N), print four integers y_i, x_i, y_i' and
  x_i' (1 \leq y_i, y_i' \leq H and 1 \leq x_i, x_i' \leq W), representing the
  i-th operation. These four integers represents the operation of moving one of
  the coins placed in Cell (y_i, x_i) to a vertically or horizontally adjacent
  cell, (y_i', x_i').
  
  Note that if the specified operation violates the specification in the problem
  statement or the output format is invalid, it will result in _Wrong Answer_.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      H W
      a_{11} a_{12} ... a_{1W}
      a_{21} a_{22} ... a_{2W}
      :
      a_{H1} a_{H2} ... a_{HW}
attempt: #!/usr/bin/env python3
  import sys
  
  
  def validToGo(h, w, H, W, visited):
      return h >= 0 and w >= 0 and h < H and w < W and not visited[h][w]
  
  
  def prettyPrint(M):
      for i in range(len(M)):
          r = M[i]
          message = ""
          for j in range(len(r)):
              message += f" {r[j]}"
          print(message)
  
  
  def solve(H: int, W: int, a: "List[List[int]]"):
      visited = [[False for w in range(W)] for h in range(H)]
      odds = set([])
      count = 0
      for h in range(H):
          for w in range(W):
              count += a[h][w]
              if a[h][w] % 2 == 1:
                  odds.add((h, w))
      step = 0
      steps = []
      while len(odds) > count % 2:
          # prettyPrint(a)
          h, w = odds.pop()
          if a[h][w] % 2 == 0:
              continue
          step += 1
          # print(f"next: ({h} , {w})")
          visited[h][w] = True
          if validToGo(h - 1, w, H, W, visited) and a[h - 1][w] % 2 == 1:
              a[h - 1][w] += 1
              a[h][w] -= 1
              steps.append((h, w, h - 1, w))
              continue
          if validToGo(h + 1, w, H, W, visited) and a[h + 1][w] % 2 == 1:
              a[h + 1][w] += 1
              a[h][w] -= 1
              steps.append((h, w, h + 1, w))
              continue
          if validToGo(h, w - 1, H, W, visited) and a[h][w - 1] % 2 == 1:
              a[h][w - 1] += 1
              a[h][w] -= 1
              steps.append((h, w, h, w - 1))
              continue
          if validToGo(h, w + 1, H, W, visited) and a[h][w + 1] % 2 == 1:
              a[h][w + 1] += 1
              a[h][w] -= 1
              steps.append((h, w, h, w + 1))
              continue
          if validToGo(h - 1, w, H, W, visited) and a[h - 1][w] % 2 == 0:
              a[h - 1][w] += 1
              a[h][w] -= 1
              odds.add((h - 1, w))
              steps.append((h, w, h - 1, w))
              continue
          if validToGo(h + 1, w, H, W, visited) and a[h + 1][w] % 2 == 0:
              a[h + 1][w] += 1
              a[h][w] -= 1
              odds.add((h + 1, w))
              steps.append((h, w, h + 1, w))
              continue
          if validToGo(h, w - 1, H, W, visited) and a[h][w - 1] % 2 == 0:
              a[h][w - 1] += 1
              a[h][w] -= 1
              odds.add((h, w - 1))
              steps.append((h, w, h, w - 1))
              continue
          if validToGo(h, w + 1, H, W, visited) and a[h][w + 1] % 2 == 0:
              a[h][w + 1] += 1
              a[h][w] -= 1
              odds.add((h, w + 1))
              steps.append((h, w, h, w + 1))
              continue
      print(step)
      for s in steps:
          print(f"{s[0]} {s[1]} {s[2]} {s[3]}")
      # prettyPrint(a)
      return
  
  
  # Generated by 1.1.4 https://github.com/kyuridenamida/atcoder-tools  (tips: You use the default template now. You can remove this line by using your custom template)
  def main():
      def iterate_tokens():
          for line in sys.stdin:
              for word in line.split():
                  yield word
  
      tokens = iterate_tokens()
      H = int(next(tokens))  # type: int
      W = int(next(tokens))  # type: int
      a = [
          [int(next(tokens)) for _ in range(W)] for _ in range(H)
      ]  # type: "List[List[int]]"
      solve(H, W, a)
  
  
  if __name__ == "__main__":
      main()
  
problem_description: Statement
  
  There is a grid of square cells with H horizontal rows and W vertical columns.
  The cell at the i-th row and the j-th column will be denoted as Cell (i, j).
  
  In Cell (i, j), a_{ij} coins are placed.
  
  You can perform the following operation any number of times:
  
  Operation: Choose a cell that was not chosen before and contains one or more
  coins, then move one of those coins to a vertically or horizontally adjacent
  cell.
  
  Maximize the number of cells containing an even number of coins.
samples: [{"input": "2 3\n    1 2 3\n    0 1 1", "output": "3\n    2 2 2 3\n    1 1 1 2\n    1 3 1 2\n    \n\nEvery cell contains an even number of coins after the following sequence of\noperations:\n\n  * Move the coin in Cell (2, 2) to Cell (2, 3).\n  * Move the coin in Cell (1, 1) to Cell (1, 2).\n  * Move one of the coins in Cell (1, 3) to Cell (1, 2).\n\n* * *"}, {"input": "3 2\n    1 0\n    2 1\n    1 0", "output": "3\n    1 1 1 2\n    1 2 2 2\n    3 1 3 2\n    \n\n* * *"}, {"input": "1 5\n    9 9 9 9 9", "output": "2\n    1 1 1 2\n    1 3 1 4"}]