Buggy python submission (verdict: Runtime Error):
import sys
fin = sys.stdin.readline


# def dfs(a_list, used, start, strategy):
#     # DFSで更新後のa_listとusedを返す。
#     # 難しいのは移動先の選び方。移動先は奇数と偶数なら奇数を優先してほしい。
#     odds = []
#     y, x = start
#     #for dy, dx in ((-1, 0), (0, 1), (0, -1), (1, 0)):
#     for dy, dx in ((-1, 0), (0, 1)):
#         if y+dy < 0 or y+dy >= H or x+dx < 0 or x+dx >= W:
#             continue
#         elif used[y+dy][x+dx]:
#             continue
#         else:
#             # 奇数なら終わり
#             if a_list[y+dy][x+dx] % 2 == 1:
#                 a_list[y][x] -= 1
#                 a_list[y+dy][x+dx] += 1
#                 used[y][x] = True
#                 strategy.append((y, x, y+dy, x+dx))
#                 return a_list, used, strategy
#             else:
#                 odds.append((dy, dx))
#     # 偶数0なら移動
#     else:
#         try:
#             dy, dx = odds[0]
#         except:
#             return a_list, used, strategy
#         a_list[y][x] -= 1
#         a_list[y+dy][x+dx] += 1
#         used[y][x] = True
#         strategy.append((y, x, y+dy, x+dx))
#         a_list, used, strategy = dfs(a_list, used, (y+dy,x+dx), strategy)
#         return a_list, used, strategy


# H, W = [int(elem) for elem in input().split(' ')]
# a_list = [[int(elem) for elem in fin().split(' ')] for _ in range(H)]
# assert len(a_list) == H
# assert len(a_list[0]) == W


# # 近いところに行き着き次第終わるというDFSでいけるのでは？
# used = [[False] * W for _ in range(H)]
# strategy = []
# for y in range(H):
#     for x in range(W):
#         if a_list[y][x] % 2 != 0:
#             a_list, used, strategy = dfs(a_list, used, (y, x), strategy)

# print(len(strategy))
# for s in strategy:
#     print(' '.join([str(elem + 1) for elem in s]))


H, W = [int(elem) for elem in input().split(' ')]
a_list = [[int(elem) for elem in fin().split(' ')] for _ in range(H)]
assert len(a_list) == H
assert len(a_list[0]) == W

strategy = []
for i in range(H):
    for j in range(W):
        if a_list[i][j] % 2 == 1:
            a_list[i][j] -= 1
            if i < H and j < W:
                a_list[i][j+1] += 1
                strategy.append((i+1, j+1, i+1, j+2))
            elif i < H:
                a_list[i+1][j] += 1
                strategy.append((i+1, j+1, i+2, j+1))
            else:
                continue

print(len(strategy))
for tup in strategy:
    print(' '.join([str(elem) for elem in tup]))


Fixed submission:
import sys
fin = sys.stdin.readline


# def dfs(a_list, used, start, strategy):
#     # DFSで更新後のa_listとusedを返す。
#     # 難しいのは移動先の選び方。移動先は奇数と偶数なら奇数を優先してほしい。
#     odds = []
#     y, x = start
#     #for dy, dx in ((-1, 0), (0, 1), (0, -1), (1, 0)):
#     for dy, dx in ((-1, 0), (0, 1)):
#         if y+dy < 0 or y+dy >= H or x+dx < 0 or x+dx >= W:
#             continue
#         elif used[y+dy][x+dx]:
#             continue
#         else:
#             # 奇数なら終わり
#             if a_list[y+dy][x+dx] % 2 == 1:
#                 a_list[y][x] -= 1
#                 a_list[y+dy][x+dx] += 1
#                 used[y][x] = True
#                 strategy.append((y, x, y+dy, x+dx))
#                 return a_list, used, strategy
#             else:
#                 odds.append((dy, dx))
#     # 偶数0なら移動
#     else:
#         try:
#             dy, dx = odds[0]
#         except:
#             return a_list, used, strategy
#         a_list[y][x] -= 1
#         a_list[y+dy][x+dx] += 1
#         used[y][x] = True
#         strategy.append((y, x, y+dy, x+dx))
#         a_list, used, strategy = dfs(a_list, used, (y+dy,x+dx), strategy)
#         return a_list, used, strategy


# H, W = [int(elem) for elem in input().split(' ')]
# a_list = [[int(elem) for elem in fin().split(' ')] for _ in range(H)]
# assert len(a_list) == H
# assert len(a_list[0]) == W


# # 近いところに行き着き次第終わるというDFSでいけるのでは？
# used = [[False] * W for _ in range(H)]
# strategy = []
# for y in range(H):
#     for x in range(W):
#         if a_list[y][x] % 2 != 0:
#             a_list, used, strategy = dfs(a_list, used, (y, x), strategy)

# print(len(strategy))
# for s in strategy:
#     print(' '.join([str(elem + 1) for elem in s]))


H, W = [int(elem) for elem in input().split(' ')]
a_list = [[int(elem) for elem in fin().split(' ')] for _ in range(H)]
assert len(a_list) == H
assert len(a_list[0]) == W

strategy = []
used = [[False] * W for _ in range(H)]
for i in range(H):
    for j in range(W):
        if a_list[i][j] % 2 == 1 and (not used[i][j]):
            a_list[i][j] -= 1
            if j < W - 1:
                a_list[i][j+1] += 1
                strategy.append((i+1, j+1, i+1, j+2))
                used[i][j] = True
            elif i < H - 1:
                a_list[i+1][j] += 1
                strategy.append((i+1, j+1, i+2, j+1))
                used[i][j] = True
            else:
                continue

print(len(strategy))
for tup in strategy:
    print(' '.join([str(elem) for elem in tup]))

Buggy python submission (verdict: Runtime Error):
 import sys
fin = sys.stdin.readline


# def dfs(a_list, used, start, strategy):
#     # DFSで更新後のa_listとusedを返す。
#     # 難しいのは移動先の選び方。移動先は奇数と偶数なら奇数を優先してほしい。
#     odds = []
#     y, x = start
#     #for dy, dx in ((-1, 0), (0, 1), (0, -1), (1, 0)):
#     for dy, dx in ((-1, 0), (0, 1)):
#         if y+dy < 0 or y+dy >= H or x+dx < 0 or x+dx >= W:
#             continue
#         elif used[y+dy][x+dx]:
#             continue
#         else:
#             # 奇数なら終わり
#             if a_list[y+dy][x+dx] % 2 == 1:
#                 a_list[y][x] -= 1
#                 a_list[y+dy][x+dx] += 1
#                 used[y][x] = True
#                 strategy.append((y, x, y+dy, x+dx))
#                 return a_list, used, strategy
#             else:
#                 odds.append((dy, dx))
#     # 偶数0なら移動
#     else:
#         try:
#             dy, dx = odds[0]
#         except:
#             return a_list, used, strategy
#         a_list[y][x] -= 1
#         a_list[y+dy][x+dx] += 1
#         used[y][x] = True
#         strategy.append((y, x, y+dy, x+dx))
#         a_list, used, strategy = dfs(a_list, used, (y+dy,x+dx), strategy)
#         return a_list, used, strategy


# H, W = [int(elem) for elem in input().split(' ')]
# a_list = [[int(elem) for elem in fin().split(' ')] for _ in range(H)]
# assert len(a_list) == H
# assert len(a_list[0]) == W


# # 近いところに行き着き次第終わるというDFSでいけるのでは？
# used = [[False] * W for _ in range(H)]
# strategy = []
# for y in range(H):
#     for x in range(W):
#         if a_list[y][x] % 2 != 0:
#             a_list, used, strategy = dfs(a_list, used, (y, x), strategy)

# print(len(strategy))
# for s in strategy:
#     print(' '.join([str(elem + 1) for elem in s]))


H, W = [int(elem) for elem in input().split(' ')]
a_list = [[int(elem) for elem in fin().split(' ')] for _ in range(H)]
assert len(a_list) == H
assert len(a_list[0]) == W

strategy = []
for i in range(H):
    for j in range(W):
        if a_list[i][j] % 2 == 1:
            a_list[i][j] -= 1
            if i < H and j < W:
                a_list[i][j+1] += 1
                strategy.append((i+1, j+1, i+1, j+2))
            elif i < H:
                a_list[i+1][j] += 1
                strategy.append((i+1, j+1, i+2, j+1))
            else:
                continue

print(len(strategy))
for tup in strategy:
    print(' '.join(tup))

Fixed submission:
import sys
fin = sys.stdin.readline


# def dfs(a_list, used, start, strategy):
#     # DFSで更新後のa_listとusedを返す。
#     # 難しいのは移動先の選び方。移動先は奇数と偶数なら奇数を優先してほしい。
#     odds = []
#     y, x = start
#     #for dy, dx in ((-1, 0), (0, 1), (0, -1), (1, 0)):
#     for dy, dx in ((-1, 0), (0, 1)):
#         if y+dy < 0 or y+dy >= H or x+dx < 0 or x+dx >= W:
#             continue
#         elif used[y+dy][x+dx]:
#             continue
#         else:
#             # 奇数なら終わり
#             if a_list[y+dy][x+dx] % 2 == 1:
#                 a_list[y][x] -= 1
#                 a_list[y+dy][x+dx] += 1
#                 used[y][x] = True
#                 strategy.append((y, x, y+dy, x+dx))
#                 return a_list, used, strategy
#             else:
#                 odds.append((dy, dx))
#     # 偶数0なら移動
#     else:
#         try:
#             dy, dx = odds[0]
#         except:
#             return a_list, used, strategy
#         a_list[y][x] -= 1
#         a_list[y+dy][x+dx] += 1
#         used[y][x] = True
#         strategy.append((y, x, y+dy, x+dx))
#         a_list, used, strategy = dfs(a_list, used, (y+dy,x+dx), strategy)
#         return a_list, used, strategy


# H, W = [int(elem) for elem in input().split(' ')]
# a_list = [[int(elem) for elem in fin().split(' ')] for _ in range(H)]
# assert len(a_list) == H
# assert len(a_list[0]) == W


# # 近いところに行き着き次第終わるというDFSでいけるのでは？
# used = [[False] * W for _ in range(H)]
# strategy = []
# for y in range(H):
#     for x in range(W):
#         if a_list[y][x] % 2 != 0:
#             a_list, used, strategy = dfs(a_list, used, (y, x), strategy)

# print(len(strategy))
# for s in strategy:
#     print(' '.join([str(elem + 1) for elem in s]))


H, W = [int(elem) for elem in input().split(' ')]
a_list = [[int(elem) for elem in fin().split(' ')] for _ in range(H)]
assert len(a_list) == H
assert len(a_list[0]) == W

strategy = []
used = [[False] * W for _ in range(H)]
for i in range(H):
    for j in range(W):
        if a_list[i][j] % 2 == 1 and (not used[i][j]):
            a_list[i][j] -= 1
            if j < W - 1:
                a_list[i][j+1] += 1
                strategy.append((i+1, j+1, i+1, j+2))
                used[i][j] = True
            elif i < H - 1:
                a_list[i+1][j] += 1
                strategy.append((i+1, j+1, i+2, j+1))
                used[i][j] = True
            else:
                continue

print(len(strategy))
for tup in strategy:
    print(' '.join([str(elem) for elem in tup]))