#include <bits/stdc++.h>
using std::abs;
using std::bitset;
using std::cerr;
using std::cin;
using std::cout;
using std::map;
using std::max;
using std::min;
using std::pair;
using std::set;
using std::sort;
using std::string;
using std::swap;
using std::unordered_map;
using std::unordered_set;
using std::vector;
using ll = long long;
using uint = unsigned int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using ull = unsigned long long;
using ld = long double;
using vci = vector<int>;
using vcl = vector<ll>;
template <typename T>
void _dbg(const char* _s, T _h) {
  cerr << _s << " = " << _h << "\n";
}
template <typename T, typename... Ts>
void _dbg(const char* _s, T _h, Ts... _t) {
  int _b = 0;
  while (((_b += *_s == '(') -= *_s == ')') != 0 || *_s != ',') cerr << *_s++;
  cerr << " = " << _h << ",";
  _dbg(_s + 1, _t...);
}
struct init {
  init() {
    cin.tie(0);
    std::iostream::sync_with_stdio(0);
    cout << std::fixed << std::setprecision(10);
    cerr << std::fixed << std::setprecision(5);
  }
  ~init() {}
} init;
template <typename T, typename U>
void upx(T& x, U y) {
  if (x < y) x = y;
}
template <typename T, typename U>
void upn(T& x, U y) {
  if (x > y) x = y;
}
const int N = 333;
string a[N][N];
string b[N][N];
struct query {
  int x1, y1, x2, y2;
  query(int _x1, int _y1, int _x2, int _y2)
      : x1(_x1), y1(_y1), x2(_x2), y2(_y2) {}
};
int32_t main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) {
      cin >> a[i][j];
    }
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) cin >> b[i][j];
  vector<query> ans;
  reverse(a[1][m].begin(), a[1][m].end());
  reverse(a[n][1].begin(), a[n][1].end());
  for (int k = (int)a[1][1].size() - 1; k >= 0; --k) {
    if (a[1][1][k] == '0') {
      ans.emplace_back(1, 1, n, 1);
      ;
      a[n][1] += '0';
    } else {
      ans.emplace_back(1, 1, 1, m);
      ;
      a[1][m] += '1';
    }
  };
  for (int k = (int)a[n][m].size() - 1; k >= 0; --k) {
    if (a[n][m][k] == '0') {
      ans.emplace_back(n, m, n, 1);
      ;
      a[n][1] += '0';
    } else {
      ans.emplace_back(n, m, 1, m);
      ;
      a[1][m] += '1';
    }
  };
  a[1][1].clear();
  a[n][m].clear();
  reverse(a[1][m].begin(), a[1][m].end());
  reverse(a[n][1].begin(), a[n][1].end());
  for (int i = 1; i <= n; ++i) {
    reverse(a[i][1].begin(), a[i][1].end());
    reverse(a[i][m].begin(), a[i][m].end());
    for (int j = 2; j < m; ++j) {
      for (int k = (int)a[i][j].size() - 1; k >= 0; --k) {
        if (a[i][j][k] == '0') {
          ans.emplace_back(i, j, i, 1);
          ;
          a[i][1] += '0';
        } else {
          ans.emplace_back(i, j, i, m);
          ;
          a[i][m] += '1';
        }
      }
      a[i][j].clear();
    };
    reverse(a[i][1].begin(), a[i][1].end());
    if (i > 1) {
      for (int k = (int)a[i][1].size() - 1; k >= 0; --k) {
        if (a[i][1][k] == '0') {
          ans.emplace_back(i, 1, 1, 1);
          ;
          a[1][1] += '0';
        } else {
          ans.emplace_back(i, 1, i, m);
          ;
          a[i][m] += '1';
        }
      }
      a[i][1].clear();
    }
    reverse(a[i][m].begin(), a[i][m].end());
    ;
    if (i < n) {
      ;
      for (int k = (int)a[i][m].size() - 1; k >= 0; --k) {
        if (a[i][m][k] == '0') {
          ans.emplace_back(i, m, i, 1);
          ;
          a[i][1] += '0';
        } else {
          ans.emplace_back(i, m, n, m);
          ;
          a[n][m] += '1';
        }
      }
      a[i][m].clear();
    }
    if (i > 1) {
      for (int k = (int)a[i][1].size() - 1; k >= 0; --k) {
        if (a[i][1][k] == '0') {
          ans.emplace_back(i, 1, 1, 1);
          ;
          a[1][1] += '0';
        } else {
          assert(0);
          ans.emplace_back(i, 1, i, m);
          ;
          a[i][m] += '1';
        }
      }
      a[i][1].clear();
    };
  }
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      ;
  int c0, c1;
  c0 = count(b[1][1].begin(), b[1][1].end(), '0');
  c1 = count(b[1][1].begin(), b[1][1].end(), '1');
  while (c0--) {
    ans.emplace_back(1, 1, 1, m);
    ;
  }
  while (c1--) {
    ans.emplace_back(n, m, n, 1);
    ;
  }
  for (int k = (int)b[1][1].size() - 1; k >= 0; --k) {
    if (b[1][1][k] == '0') {
      ans.emplace_back(1, m, 1, 1);
      ;
    } else {
      ans.emplace_back(n, 1, 1, 1);
      ;
    }
  };
  c0 = count(b[n][m].begin(), b[n][m].end(), '0');
  c1 = count(b[n][m].begin(), b[n][m].end(), '1');
  while (c0--) {
    ans.emplace_back(1, 1, 1, m);
    ;
  }
  while (c1--) {
    ans.emplace_back(n, m, n, 1);
    ;
  }
  for (int k = (int)b[n][m].size() - 1; k >= 0; --k) {
    if (b[n][m][k] == '0') {
      ans.emplace_back(1, m, n, m);
      ;
    } else {
      ans.emplace_back(n, 1, n, m);
      ;
    }
  };
  for (int i = 1; i <= n; ++i) {
    for (int j = 2; j < m; ++j) {
      for (int k = (int)b[i][j].size() - 1; k >= 0; --k) {
        if (b[i][j][k] == '0') {
          if (i > 1) ans.emplace_back(1, 1, i, 1);
          if (i > 1)
            ;
          ans.emplace_back(i, 1, i, j);
          ;
        } else {
          if (i < n) ans.emplace_back(n, m, i, m);
          if (i < n)
            ;
          ans.emplace_back(i, m, i, j);
          ;
        }
      }
    }
    int need = i < n ? count(b[i][m].begin(), b[i][m].end(), '0') : 0;
    if (i > 1) {
      while (need--) {
        ans.emplace_back(1, 1, i, 1);
        ;
      }
      for (int k = (int)b[i][1].size() - 1; k >= 0; --k) {
        if (b[i][1][k] == '0') {
          ans.emplace_back(1, 1, i, 1);
          ;
        } else {
          if (i < n) ans.emplace_back(n, m, i, m);
          if (i < n)
            ;
          ans.emplace_back(i, m, i, 1);
          ;
        }
      }
    }
    if (i < n) {
      for (int k = (int)b[i][m].size() - 1; k >= 0; --k) {
        if (b[i][m][k] == '0') {
          ans.emplace_back(i, 1, i, m);
          ;
        } else {
          ans.emplace_back(n, m, i, m);
          ;
        }
      }
    }
  }
  cout << ans.size() << '\n';
  for (auto& i : ans)
    cout << i.x1 << ' ' << i.y1 << ' ' << i.x2 << ' ' << i.y2 << '\n';
  return 0;
}
