#include <bits/stdc++.h>
using namespace std;
int n, m;
string st[300 * 300];
string en[300 * 300];
pair<int, int> ans[400005][2];
int cur, cutl, cutr;
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) cin >> st[((((i) * (m) + (j))))];
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) cin >> en[((((i) * (m) + (j))))];
  cur = 0;
  while (!st[0].empty()) {
    st[((((0) * (m) + (m - 1))))].insert(st[((((0) * (m) + (m - 1))))].begin(),
                                         st[0].back());
    st[0].pop_back();
    ans[cur][0] = {0, 0};
    ans[cur++][1] = {0, m - 1};
  }
  while (!st[((((n - 1) * (m) + (m - 1))))].empty()) {
    st[((((n - 1) * (m) + (0))))].insert(
        st[((((n - 1) * (m) + (0))))].begin(),
        st[((((n - 1) * (m) + (m - 1))))].back());
    st[((((n - 1) * (m) + (m - 1))))].pop_back();
    ans[cur][0] = {n - 1, m - 1};
    ans[cur++][1] = {n - 1, 0};
  }
  for (int i = 0; i < m - 1; ++i) {
    while (!st[((((0) * (m) + (i))))].empty()) {
      if (st[((((0) * (m) + (i))))].back() == '1') {
        st[((((0) * (m) + (i))))].pop_back();
        ans[cur][0] = {0, i};
        ans[cur++][1] = {0, 0};
      } else {
        st[((((0) * (m) + (m - 1))))].insert(
            st[((((0) * (m) + (m - 1))))].begin(),
            st[((((0) * (m) + (i))))].back());
        st[((((0) * (m) + (i))))].pop_back();
        ans[cur][0] = {0, i};
        ans[cur++][1] = {0, m - 1};
      }
    }
  }
  while (!st[((((0) * (m) + (m - 1))))].empty()) {
    if (st[((((0) * (m) + (m - 1))))].back() == '1') {
      st[((((0) * (m) + (m - 1))))].pop_back();
      ans[cur][0] = {0, m - 1};
      ans[cur++][1] = {0, 0};
    } else {
      st[((((0) * (m) + (m - 1))))].pop_back();
      ans[cur][0] = {0, m - 1};
      ans[cur++][1] = {n - 1, m - 1};
    }
  }
  for (int i = m - 2; i > 0; --i) {
    while (!st[((((n - 1) * (m) + (i))))].empty()) {
      if (st[((((n - 1) * (m) + (i))))].back() == '1') {
        st[((((n - 1) * (m) + (0))))].insert(
            st[((((n - 1) * (m) + (0))))].begin(),
            st[((((n - 1) * (m) + (i))))].back());
        st[((((n - 1) * (m) + (i))))].pop_back();
        ans[cur][0] = {n - 1, i};
        ans[cur++][1] = {n - 1, 0};
      } else {
        st[((((n - 1) * (m) + (i))))].pop_back();
        ans[cur][0] = {n - 1, i};
        ans[cur++][1] = {n - 1, m - 1};
      }
    }
  }
  while (!st[((((n - 1) * (m) + (0))))].empty()) {
    if (st[((((n - 1) * (m) + (0))))].back() == '1') {
      st[((((n - 1) * (m) + (0))))].pop_back();
      ans[cur][0] = {n - 1, 0};
      ans[cur++][1] = {0, 0};
    } else {
      st[((((n - 1) * (m) + (0))))].pop_back();
      ans[cur][0] = {n - 1, 0};
      ans[cur++][1] = {n - 1, m - 1};
    }
  }
  for (int i = 1; i < n - 1; ++i)
    for (int j = 0; j < m; ++j) {
      while (!st[((((i) * (m) + (j))))].empty()) {
        if (st[((((i) * (m) + (j))))].back() == '1') {
          st[((((i) * (m) + (j))))].pop_back();
          ans[cur][0] = {i, j};
          ans[cur++][1] = {0, j};
          if (j) {
            ans[cur][0] = {0, j};
            ans[cur++][1] = {0, 0};
          }
        } else {
          st[((((i) * (m) + (j))))].pop_back();
          ans[cur][0] = {i, j};
          ans[cur++][1] = {n - 1, j};
          if (j != m - 1) {
            ans[cur][0] = {n - 1, j};
            ans[cur++][1] = {n - 1, m - 1};
          }
        }
      }
    }
  for (int i = 1; i < n - 1; ++i)
    for (int j = 0; j < m; ++j) {
      while (!en[((((i) * (m) + (j))))].empty()) {
        if (en[((((i) * (m) + (j))))].back() == '1') {
          en[((((i) * (m) + (j))))].pop_back();
          if (j) {
            ans[cur][0] = {0, 0};
            ans[cur++][1] = {0, j};
          }
          ans[cur][0] = {0, j};
          ans[cur++][1] = {i, j};
        } else {
          en[((((i) * (m) + (j))))].pop_back();
          if (j != m - 1) {
            ans[cur][0] = {n - 1, m - 1};
            ans[cur++][1] = {n - 1, j};
          }
          ans[cur][0] = {n - 1, j};
          ans[cur++][1] = {i, j};
        }
      }
    }
  for (int i = 1; i < m - 1; ++i) {
    while (!en[((((0) * (m) + (i))))].empty()) {
      if (en[((((0) * (m) + (i))))].back() == '1') {
        en[((((0) * (m) + (i))))].pop_back();
        ans[cur][0] = {0, 0};
        ans[cur++][1] = {0, i};
      } else {
        en[((((0) * (m) + (i))))].pop_back();
        ans[cur][0] = {n - 1, m - 1};
        ans[cur++][1] = {0, m - 1};
        ans[cur][0] = {0, m - 1};
        ans[cur++][1] = {0, i};
      }
    }
  }
  for (int i = m - 2; i > 0; --i) {
    while (!en[((((n - 1) * (m) + (i))))].empty()) {
      if (en[((((n - 1) * (m) + (i))))].back() == '1') {
        en[((((n - 1) * (m) + (i))))].pop_back();
        ans[cur][0] = {0, 0};
        ans[cur++][1] = {n - 1, 0};
        ans[cur][0] = {n - 1, 0};
        ans[cur++][1] = {n - 1, i};
      } else {
        en[((((n - 1) * (m) + (i))))].pop_back();
        ans[cur][0] = {n - 1, m - 1};
        ans[cur++][1] = {n - 1, i};
      }
    }
  }
  cutl = en[0].size();
  cutr = en[((((n - 1) * (m) + (m - 1))))].size();
  while (!en[0].empty()) {
    if (en[0].back() == '1') {
      en[0].pop_back();
      ans[cur][0] = {0, 0};
      ans[cur++][1] = {0, m - 1};
    } else {
      en[0].pop_back();
      ans[cur][0] = {n - 1, m - 1};
      ans[cur++][1] = {0, m - 1};
    }
  }
  while (!en[((((n - 1) * (m) + (m - 1))))].empty()) {
    if (en[((((n - 1) * (m) + (m - 1))))].back() == '1') {
      en[((((n - 1) * (m) + (m - 1))))].pop_back();
      ans[cur][0] = {0, 0};
      ans[cur++][1] = {n - 1, 0};
    } else {
      en[((((n - 1) * (m) + (m - 1))))].pop_back();
      ans[cur][0] = {n - 1, m - 1};
      ans[cur++][1] = {n - 1, 0};
    }
  }
  while (!en[((((0) * (m) + (m - 1))))].empty()) {
    if (en[((((0) * (m) + (m - 1))))].back() == '1') {
      en[((((0) * (m) + (m - 1))))].pop_back();
      ans[cur][0] = {0, 0};
      ans[cur++][1] = {0, m - 1};
    } else {
      en[((((0) * (m) + (m - 1))))].pop_back();
      ans[cur][0] = {n - 1, m - 1};
      ans[cur++][1] = {0, m - 1};
    }
  }
  while (!en[((((n - 1) * (m) + (0))))].empty()) {
    if (en[((((n - 1) * (m) + (0))))].back() == '1') {
      en[((((n - 1) * (m) + (0))))].pop_back();
      ans[cur][0] = {0, 0};
      ans[cur++][1] = {n - 1, 0};
    } else {
      en[((((n - 1) * (m) + (0))))].pop_back();
      ans[cur][0] = {n - 1, m - 1};
      ans[cur++][1] = {n - 1, 0};
    }
  }
  while (cutl--) {
    ans[cur][0] = {0, m - 1};
    ans[cur++][1] = {0, 0};
  }
  while (cutr--) {
    ans[cur][0] = {n - 1, 0};
    ans[cur++][1] = {n - 1, m - 1};
  }
  cout << cur << endl;
  for (int i = 0; i < cur; ++i) {
    cout << ans[i][0].first + 1 << ' ' << ans[i][0].second + 1 << ' '
         << ans[i][1].first + 1 << ' ' << ans[i][1].second + 1 << '\n';
  }
  return 0;
}
