#include <bits/stdc++.h>
using namespace std;
template <typename T>
T getint() {
  T x = 0, p = 1;
  char ch;
  do {
    ch = getchar();
  } while (ch <= ' ');
  if (ch == '-') p = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * p;
}
mt19937 gen(chrono::system_clock::now().time_since_epoch().count());
template <typename T1, typename T2>
bool umin(T1 &x, const T2 &y) {
  if (x > y) return x = y, true;
  return false;
}
template <typename T1, typename T2>
bool umax(T1 &x, const T2 &y) {
  if (x < y) return x = y, true;
  return false;
}
const int maxn = 300 + 10;
const int inf = (int)1e9 + 5;
const int mod = 998244353;
const long long llinf = (long long)1e18 + 5;
const long double pi = acos(-1.0);
int nxt(int l, int r) { return l + gen() % (r - l + 1); }
void testera() {
  int i = 0;
  while (true) {
    i++;
    int x = nxt(1, 100);
    int y = nxt(1, 100);
    int z = nxt(1, 100);
    int t1 = nxt(1, 200);
    int t2 = nxt(1, 200);
    int t3 = nxt(1, 200);
    int floor = x;
    int mash = x - y;
    int time1 = mash * t1;
    int total = time1;
    int liftat = x - z;
    int timelift = liftat + t2;
    int doors = t3 + t3;
    int timeforlift = mash * t2;
    int ans1 = total > timeforlift;
    int ans2 = (abs(x - y) * t1 > 3 * t3 + t2 * (abs(x - y) + abs(z - x)));
    if (ans1 == ans2) continue;
    cout << i << endl;
    cout << x << ' ' << y << ' ' << z << ' ' << t1 << ' ' << t2 << ' ' << t3
         << endl;
    exit(0);
  }
}
string s[maxn][maxn], t[maxn][maxn];
string z[maxn][maxn];
int n, m;
void addb(vector<pair<pair<int, int>, pair<int, int>>> &answer, int a, int b,
          int c, int d, int e, int f) {
  if (a == c && b == d)
    ;
  else {
    answer.push_back(make_pair(make_pair(a, b), make_pair(c, d)));
    char x = z[a][b].back();
    z[a][b].pop_back();
    z[c][d] = string(1, x) + z[c][d];
  }
  if (c == e && d == f)
    ;
  else {
    answer.push_back(make_pair(make_pair(c, d), make_pair(e, f)));
    char x = z[c][d].back();
    z[c][d].pop_back();
    z[e][f] = string(1, x) + z[e][f];
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      cout << z[i][j] << ", ";
    }
    cout << endl;
  }
  cout << endl;
}
void add(vector<pair<pair<int, int>, pair<int, int>>> &answer, int a, int b,
         int c, int d, int e, int f) {
  if (a == c && b == d)
    ;
  else {
    answer.push_back(make_pair(make_pair(a, b), make_pair(c, d)));
  }
  if (c == e && d == f)
    ;
  else {
    answer.push_back(make_pair(make_pair(c, d), make_pair(e, f)));
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      cin >> s[i][j];
      z[i][j] = s[i][j];
    }
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      cin >> t[i][j];
    }
  }
  string pref = "";
  vector<pair<pair<int, int>, pair<int, int>>> answer;
  for (int i = s[0][1].size() - 1; i >= 0; --i) {
    pref += s[0][1][i];
    add(answer, 0, 1, 0, 1, 0, 0);
  }
  for (int i = s[1][0].size() - 1; i >= 0; --i) {
    pref += s[1][0][i];
    add(answer, 1, 0, 0, 0, 0, 0);
  }
  reverse(pref.begin(), pref.end());
  s[0][0] = pref + s[0][0];
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (i == 0 && j == 1) continue;
      if (i == 1 && j == 0) continue;
      for (int k = (int)s[i][j].size() - 1; k >= 0; --k) {
        if (s[i][j][k] == '0') {
          add(answer, i, j, 0, j, 0, 1);
        } else {
          add(answer, i, j, i, 0, 1, 0);
        }
      }
    }
  }
  for (int j = m - 1; j >= 0; --j) {
    for (int i = n - 1; i >= 0; --i) {
      if (i < 2 && j < 2) continue;
      for (int k = (int)t[i][j].size() - 1; k >= 0; --k) {
        if (t[i][j][k] == '0') {
          add(answer, 0, 1, 0, j, i, j);
        } else {
          add(answer, 1, 0, i, 0, i, j);
        }
      }
    }
  }
  for (int k = (int)t[1][0].size() - 1; k >= 0; --k) {
    if (t[1][0][k] == '0')
      add(answer, 0, 1, 0, 0, 0, 0);
    else
      add(answer, 1, 0, 0, 0, 0, 0);
  }
  for (int k = (int)t[0][1].size() - 1; k >= 0; --k) {
    if (t[0][1][k] == '0')
      add(answer, 0, 1, 1, 1, 1, 1);
    else
      add(answer, 1, 0, 1, 1, 1, 1);
  }
  for (int k = (int)t[0][0].size() - 1; k >= 0; --k) {
    if (t[0][0][k] == '0')
      add(answer, 0, 1, 0, 0, 0, 0);
    else
      add(answer, 1, 0, 0, 0, 0, 0);
  }
  for (int k = (int)t[1][1].size() - 1; k >= 0; --k) {
    if (t[1][1][k] == '0')
      add(answer, 0, 1, 1, 1, 1, 1);
    else
      add(answer, 1, 0, 1, 1, 1, 1);
  }
  for (int k = 0; k < t[1][0].size(); ++k) {
    add(answer, 0, 0, 1, 0, 1, 0);
  }
  for (int k = 0; k < t[0][1].size(); ++k) {
    add(answer, 1, 1, 0, 1, 0, 1);
  }
  cout << answer.size() << endl;
  for (auto x : answer) {
    cout << x.first.first + 1 << ' ' << x.first.second + 1 << ' '
         << x.second.first + 1 << ' ' << x.second.second + 1 << '\n';
  }
  return 0;
}
