from functools import reduce
from collections import deque
import math
    
def main():
    # 文字列の2進数を数値にする
    # '101' → '5'
    # 文字列の頭に'0b'をつけてint()にわたす
    # binary = int('0b'+'101',0)

    # 2進数で立っているbitを数える
    # 101(0x5) → 2
    # cnt_bit = bin(5).count('1')
    
    # N! を求める
    # f = math.factorial(N)

    # N の逆元
    # N_inv = pow(N,MOD-2,MOD)

    # nCr
    # Nの階乗 * rの階乗の逆元 * n-rの階乗の逆元
    
    # 切り捨て
    # 4 // 3
    # 切り上げ
    #-(-4 // 3)
    
    # 初期値用:十分大きい数(100億)
    INF = float("inf")

    # 大きな素数
    MOD = 10**9+7
    
    # 1文字のみを読み込み
    # 入力:2
    # a = input().rstrip()
    # 変数:a='2'
    
    # スペース区切りで標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a, b, c, d = (int(_) for _ in input().split())  
    # 変数:a=2 b=4 c=5 d =7
    
    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a = list(int(_) for _ in input().split())
    # 変数:a = [2, 4, 5, 7]    

    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2457
    # a = list(int(_) for _ in input())
    # 変数:a = [2, 4, 5, 7]    
    H, W = (int(_) for _ in input().split())
    a=[]
    for h in range(H):
       a.append(list(int(_) for _ in input().split()))

    ans = []
    start_h = -1
    start_w = -1
    goal_h = -1
    goal_w = -1
    for h in range(H):
        for w in range(W):
            if a[h][w] % 2 == 1 and start_h == -1 and start_w == -1:
                start_h = h+1
                start_w = w+1
            elif a[h][w] % 2 == 1 and goal_h == -1 and goal_w == -1:
                goal_h = h+1
                goal_w = w+1

                pre_start_h = start_h
                pre_start_w = start_w
                for i in range(1,goal_h - start_h+1):
                    ans.append(str(pre_start_h)+" "+str(pre_start_w)+" "
                               +str(start_h+i)+" "+str(start_w))
                    pre_start_h = start_h+i
                    
                for j in range(1,goal_w - start_w+1):
                    ans.append(str(pre_start_h)+" "+str(pre_start_w)+" "
                               +str(pre_start_h)+" "+str(start_w+j))
                    pre_start_w = start_w+j
                        
                start_h = -1
                start_w = -1
                goal_h = -1
                goal_w = -1
                a[start_h-1][start_w-1]+=-1
                a[goal_h-1][goal_w-1]+=1
                
    print(len(ans))
    print("\n".join(ans))
    
if __name__ == '__main__':
    main()


### FIXED CODE ###

from functools import reduce
from collections import deque
import math
    
def main():
    # 文字列の2進数を数値にする
    # '101' → '5'
    # 文字列の頭に'0b'をつけてint()にわたす
    # binary = int('0b'+'101',0)

    # 2進数で立っているbitを数える
    # 101(0x5) → 2
    # cnt_bit = bin(5).count('1')
    
    # N! を求める
    # f = math.factorial(N)

    # N の逆元
    # N_inv = pow(N,MOD-2,MOD)

    # nCr
    # Nの階乗 * rの階乗の逆元 * n-rの階乗の逆元
    
    # 切り捨て
    # 4 // 3
    # 切り上げ
    #-(-4 // 3)
    
    # 初期値用:十分大きい数(100億)
    INF = float("inf")

    # 大きな素数
    MOD = 10**9+7
    
    # 1文字のみを読み込み
    # 入力:2
    # a = input().rstrip()
    # 変数:a='2'
    
    # スペース区切りで標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a, b, c, d = (int(_) for _ in input().split())  
    # 変数:a=2 b=4 c=5 d =7
    
    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a = list(int(_) for _ in input().split())
    # 変数:a = [2, 4, 5, 7]    

    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2457
    # a = list(int(_) for _ in input())
    # 変数:a = [2, 4, 5, 7]    
    H, W = (int(_) for _ in input().split())
    a=[]
    for h in range(H):
       a.append(list(int(_) for _ in input().split()))

    ans = []

    for h in range(H):
        for w in range(W-1):
            if a[h][w] % 2 ==1:
                ans.append((h+1,w+1,h+1,w+2))
                a[h][w] += -1
                a[h][w+1] += 1
                
    for h in range(H-1):
        if a[h][W-1] % 2 ==1:
            ans.append((h+1,W,h+2,W))
            a[h][W-1] += -1
            a[h+1][W-1] += 1
                
    print(len(ans))
    for i in ans:
        print(i[0],i[1],i[2],i[3])
    
if __name__ == '__main__':
    main()