#include <bits/stdc++.h>
using namespace std;
uint64_t rnd_data = 0xDEADBEEFDULL;
inline void my_srand(int seed) { rnd_data = ((uint64_t)seed << 16) | 0x330E; }
inline int my_rand() {
  rnd_data = rnd_data * 0x5DEECE66DULL + 0xB;
  return (rnd_data >> 17) & 0x7FFFFFFF;
}
template <typename T>
void my_random_shuffle(T b, T e) {
  for (int i = (1); i <= (int)((int)(e - b) - 1); i++) {
    swap(b[i], b[my_rand() % (i + 1)]);
  }
}
template <class _T>
inline _T sqr(const _T &x) {
  return x * x;
}
template <typename type_t, typename less_t = std::less<type_t>>
inline bool uin(type_t &a, const type_t &b, const less_t &ls = less_t()) {
  return ls(b, a) ? a = b, true : false;
}
template <typename type_t, typename less_t = std::less<type_t>>
inline bool uax(type_t &a, const type_t &b, const less_t &ls = less_t()) {
  return ls(a, b) ? a = b, true : false;
}
const long double PI = 3.1415926535897932384626433832795L;
const long double EPS = 1e-9;
int n, m, k;
deque<int> a[320][320];
int c0[320][320];
deque<int> b[320][320];
char s[102400];
int ans[102400 * 4][4];
inline void pa() {
  return;
  for (int i = 0; i < (int)(n); i++) {
    for (int j = 0; j < (int)(m); j++) {
      for (int t = 0; t < (int)(a[i][j].size()); t++) {
        cerr << a[i][j][t];
      }
      cerr << " ";
    }
    cerr << endl;
  }
  cerr << endl;
}
void mv(int x1, int y1, int x2, int y2) {
  if (x1 == x2 && y1 == y2) return;
  ans[k][0] = x1;
  ans[k][1] = y1;
  ans[k][2] = x2;
  ans[k][3] = y2;
  k++;
  assert(!a[x1][y1].empty());
  int c = a[x1][y1].back();
  a[x1][y1].pop_back();
  a[x2][y2].push_front(c);
}
int main() {
  k = 0;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < (int)(n); i++) {
    for (int j = 0; j < (int)(m); j++) {
      scanf("%s", s);
      int l = strlen(s);
      c0[i][j] = l;
      for (int t = 0; t < (int)(l); t++) {
        a[i][j].push_back(s[t] - '0');
      }
    }
  }
  for (int i = 0; i < (int)(n); i++) {
    for (int j = 0; j < (int)(m); j++) {
      scanf("%s", s);
      int l = strlen(s);
      for (int t = 0; t < (int)(l); t++) {
        b[i][j].push_back(s[t] - '0');
      }
    }
  }
  pa();
  for (int i = 0; i < (int)(n); i++) {
    for (int j = 0; j < (int)(m); j++) {
      for (int t = 0; t < (int)(c0[i][j]); t++) {
        int c = a[i][j].back();
        if (c == 0) {
          if (i == 0) {
            mv(i, j, i, (j + 1) % m);
          } else {
            mv(i, j, 0, j);
          }
        } else {
          if (i == 1) {
            mv(i, j, i, (j + 1) % m);
          } else {
            mv(i, j, 1, j);
          }
        }
      }
    }
  }
  pa();
  for (int j = 0; j < (int)(m); j++) {
    if (j == 0) continue;
    while (!a[0][j].empty()) {
      mv(0, j, 0, 0);
    }
  }
  for (int j = 0; j < (int)(m); j++) {
    if (j == 1) continue;
    while (!a[1][j].empty()) {
      mv(1, j, 1, 1);
    }
  }
  pa();
  for (int i = (n - 1); i >= (int)(2); i--) {
    for (int j = (m)-1; j >= 0; j--) {
      for (int t = (b[i][j].size()) - 1; t >= 0; t--) {
        int c = b[i][j][t];
        if (c == 0) {
          mv(0, 0, 0, j);
          mv(0, j, i, j);
        } else {
          mv(1, 1, 1, j);
          mv(1, j, i, j);
        }
      }
    }
  }
  for (int i = (2) - 1; i >= 0; i--) {
    for (int j = (m - 1); j >= (int)(2); j--) {
      for (int t = (b[i][j].size()) - 1; t >= 0; t--) {
        int c = b[i][j][t];
        if (c == 0) {
          mv(0, 0, i, 0);
          mv(i, 0, i, j);
        } else {
          mv(1, 1, i, 1);
          mv(i, 1, i, j);
        }
      }
    }
  }
  pa();
  int need101 = 0;
  for (int t = 0; t < (int)(b[0][0].size()); t++) {
    need101 += b[0][0][t] == 1;
  }
  for (int t = 0; t < (int)(b[1][1].size()); t++) {
    need101 += b[1][1][t] == 1;
  }
  int need010 = 0;
  for (int t = 0; t < (int)(b[0][0].size()); t++) {
    need010 += b[0][0][t] == 0;
  }
  for (int t = 0; t < (int)(b[1][1].size()); t++) {
    need010 += b[1][1][t] == 0;
  }
  for (int t = 0; t < (int)(need101); t++) {
    mv(1, 1, 1, 0);
  }
  for (int t = 0; t < (int)(need010); t++) {
    mv(0, 0, 0, 1);
  }
  pa();
  for (int i = 0; i < (int)(2); i++) {
    for (int j = 0; j < (int)(2); j++) {
      for (int t = (b[i][j].size()) - 1; t >= 0; t--) {
        int c = b[i][j][t];
        if (c == 0) {
          int x = i, y = j;
          if (x)
            x = 0;
          else
            y ^= 1;
          mv(x, y, i, j);
        } else {
          int x = i, y = j;
          if (!x)
            x = 1;
          else
            y ^= 1;
          mv(x, y, i, j);
        }
        pa();
      }
    }
  }
  for (int i = 0; i < (int)(n); i++) {
    for (int j = 0; j < (int)(m); j++) {
      assert(a[i][j] == b[i][j]);
    }
  }
  printf("%d\n", k);
  for (int i = 0; i < (int)(k); i++) {
    for (int j = 0; j < (int)(4); j++) {
      printf("%d%c", ans[i][j] + 1, " \n"[j == 3]);
    }
  }
  return 0;
}
