#include <bits/stdc++.h>
using namespace std;
constexpr static int MAXN = 310;
int n, m;
string g[MAXN][MAXN];
deque<int> q[MAXN][MAXN];
vector<pair<pair<int, int>, pair<int, int>>> all_operations;
void move_single(int x1, int y1, int x2, int y2) {
  int val = q[x1][y1].back();
  q[x1][y1].pop_back();
  q[x2][y2].push_front(val);
  all_operations.push_back({{x1, y1}, {x2, y2}});
}
void move_all(int x1, int y1, int x2, int y2) {
  while (q[x1][y1].size() != 0) move_single(x1, y1, x2, y2);
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      string s;
      cin >> s;
      for (int k = 0; k < s.size(); k++) q[i][j].push_back(s[k] - '0');
    }
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) cin >> g[i][j];
  for (int i = 1; i < n; i++) move_all(i, 0, 0, 0);
  for (int j = 1; j < m; j++) move_all(0, j, 0, 0);
  for (int i = 1; i < n; i++)
    for (int j = 1; j < m; j++)
      while (q[i][j].size() != 0) {
        if (q[i][j].back() == 0)
          move_single(i, j, i, 0);
        else
          move_single(i, j, 0, j);
      }
  while (q[0][0].size() != 0) {
    if (q[0][0].back() == 0)
      move_single(0, 0, 1, 0);
    else
      move_single(0, 0, 0, 1);
  }
  for (int i = 2; i < n; i++) move_all(i, 0, 1, 0);
  for (int j = 2; j < m; j++) move_all(0, j, 0, 1);
  for (int i = 1; i < n; i++)
    for (int j = 1; j < m; j++)
      for (int k = (int)g[i][j].size() - 1; k >= 0; k--) {
        if (g[i][j][k] == '0') {
          if (i != 1) move_single(1, 0, i, 0);
          move_single(i, 0, i, j);
        } else {
          if (j != 1) move_single(0, 1, 0, j);
          move_single(0, j, i, j);
        }
      }
  vector<pair<int, int>> scells;
  for (int i = 1; i < n; i++) scells.push_back({i, 0});
  for (int j = 1; j < m; j++) scells.push_back({0, j});
  scells.push_back({0, 0});
  for (auto p : scells) {
    int i = p.first, j = p.second;
    for (int k = (int)g[i][j].size() - 1; k >= 0; k--) {
      if (g[i][j][k] == '0')
        move_single(1, 0, 0, 0);
      else
        move_single(0, 1, 0, 0);
    }
  }
  scells.pop_back();
  for (auto p : scells) {
    int i = p.first, j = p.second;
    for (int k = 0; k < g[i][j].size(); k++) move_single(0, 0, i, j);
  }
  printf("%d\n", (int)all_operations.size());
  for (int i = 0; i < all_operations.size(); i++) {
    auto p = all_operations[i];
    printf("%d %d %d %d\n", p.first.first + 1, p.first.second + 1,
           p.second.first + 1, p.second.second + 1);
  }
}
