#include <bits/stdc++.h>
using namespace std;
int rows, cols;
queue<bool> grid[300][300];
vector<bool> goal[300][300];
int osize[300][300];
struct Move {
  int x1, y1, x2, y2;
};
vector<Move> moves;
void makemove(int x1, int y1, int x2, int y2) {
  assert(x1 != x2 || y1 != y2);
  moves.push_back({x1, y1, x2, y2});
  grid[x2][y2].push(grid[x1][y1].front());
  grid[x1][y1].pop();
}
void dprint() {
  return;
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      string out;
      queue<bool> restore;
      while (grid[i][j].size()) {
        out += (grid[i][j].front() ? '1' : '0');
        restore.push(grid[i][j].front());
        grid[i][j].pop();
      }
      while (restore.size()) {
        grid[i][j].push(restore.front());
        restore.pop();
      }
      for (int k = out.size() - 1; k >= 0; k--) cerr << out[k];
      cerr << " ";
    }
    cerr << endl;
  }
  cerr << endl;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> rows >> cols;
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      string inp;
      cin >> inp;
      for (int k = inp.size() - 1; k >= 0; k--) {
        if (inp[k] == '0')
          grid[i][j].push(0);
        else
          grid[i][j].push(1);
      }
      osize[i][j] = inp.size();
    }
  }
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      string inp;
      cin >> inp;
      for (int k = 0; k < inp.size(); k++) {
        if (inp[k] == '0')
          goal[i][j].push_back(0);
        else
          goal[i][j].push_back(1);
      }
    }
  }
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      for (int k = 0; k < osize[i][j]; k++) {
        if (grid[i][j].front() == 1) {
          if (i == rows - 1) {
            int d = (j + 1) % cols;
            makemove(i, j, rows - 1, d);
          } else
            makemove(i, j, rows - 1, j);
        } else {
          if (i == 0) {
            int d = (j + 1) % cols;
            makemove(i, j, 0, d);
          } else
            makemove(i, j, 0, j);
        }
      }
    }
  }
  for (int j = 1; j < cols; j++) {
    while (grid[0][j].size()) makemove(0, j, 0, 0);
  }
  for (int j = 0; j < cols - 1; j++) {
    while (grid[rows - 1][j].size()) makemove(rows - 1, j, rows - 1, cols - 1);
  }
  for (int i = goal[0][0].size() - 1; i >= 0; i--) {
    if (goal[0][0][i] == 1) {
      makemove(rows - 1, cols - 1, rows - 1, 0);
      makemove(rows - 1, 0, 0, 0);
    } else {
      makemove(0, 0, 1, 0);
      makemove(1, 0, 0, 0);
    }
  }
  for (int i = goal[rows - 1][cols - 1].size() - 1; i >= 0; i--) {
    if (goal[rows - 1][cols - 1][i]) {
      makemove(rows - 1, cols - 1, rows - 2, cols - 1);
      makemove(rows - 2, cols - 1, rows - 1, cols - 1);
    } else {
      makemove(0, 0, rows - 1, 0);
      makemove(rows - 1, 0, rows - 1, cols - 1);
    }
  }
  for (int i = 1; i < rows - 1; i++) {
    for (int j = 1; j < cols - 1; j++) {
      for (int k = goal[i][j].size() - 1; k >= 0; k--) {
        if (goal[i][j][k]) {
          makemove(rows - 1, cols - 1, i, cols - 1);
          makemove(i, cols - 1, i, j);
        } else {
          makemove(0, 0, i, 0);
          makemove(i, 0, i, j);
        }
      }
    }
  }
  dprint();
  for (int i = 1; i < rows - 1; i++) {
    for (int k = goal[i][0].size() - 1; k >= 0; k--) {
      if (goal[i][0][k]) {
        makemove(rows - 1, cols - 1, rows - 1, 0);
        makemove(rows - 1, 0, i, 0);
      } else {
        makemove(0, 0, i, 0);
      }
    }
    for (int k = goal[i][cols - 1].size() - 1; k >= 0; k--) {
      if (goal[i][cols - 1][k]) {
        makemove(rows - 1, cols - 1, i, cols - 1);
      } else {
        makemove(0, 0, 0, cols - 1);
        makemove(0, cols - 1, i, cols - 1);
      }
    }
  }
  for (int i = 1; i < cols - 1; i++) {
    for (int k = goal[0][i].size() - 1; k >= 0; k--) {
      if (goal[0][i][k]) {
        makemove(rows - 1, cols - 1, 0, cols - 1);
        makemove(0, cols - 1, 0, i);
      } else
        makemove(0, 0, 0, i);
    }
    for (int k = goal[rows - 1][i].size() - 1; k >= 0; k--) {
      if (goal[rows - 1][i][k]) {
        makemove(rows - 1, cols - 1, rows - 1, i);
      } else {
        makemove(0, 0, rows - 1, 0);
        makemove(rows - 1, 0, rows - 1, i);
      }
    }
  }
  for (int i = goal[0][cols - 1].size() - 1; i >= 0; i--) {
    if (goal[0][cols - 1][i]) {
      makemove(rows - 1, cols - 1, 0, cols - 1);
    } else
      makemove(0, 0, 0, cols - 1);
  }
  for (int i = goal[rows - 1][0].size() - 1; i >= 0; i--) {
    if (goal[rows - 1][0][i]) {
      makemove(rows - 1, cols - 1, rows - 1, 0);
    } else
      makemove(0, 0, rows - 1, 0);
  }
  cout << moves.size() << "\n";
  for (auto &[x1, y1, x2, y2] : moves) {
    cout << x1 + 1 << " " << y1 + 1 << " " << x2 + 1 << " " << y2 + 1 << "\n";
  }
}
