#include <bits/stdc++.h>
using namespace std;
#pragma GCC diagnostic ignored "-Wsign-compare"
int64_t divCeil(int64_t x, int64_t y) { return (x + y - 1) / y; }
vector<int64_t> readVec(int64_t n) {
  vector<int64_t> a(n);
  for (int64_t i = 0; i < n; i++) cin >> a[i];
  return a;
}
struct Solver {
  int64_t n, m;
  vector<int64_t> ans;
  vector<string> s;
  Solver(int64_t n_, int64_t m_) {
    n = n_;
    m = m_;
    s.resize(n);
  }
  void invert(int64_t x, int64_t y) {
    ans.push_back(x);
    ans.push_back(y);
    s[x][y] = (s[x][y] == '1') ? '0' : '1';
  }
  void invert(pair<int64_t, int64_t> p) { invert(p.first, p.second); }
  void solve() {
    for (int64_t i = n - 1; i >= 2; i--) {
      for (int64_t j = 0; j < m; j++) {
        if (s[i][j] == '1') {
          invert(i, j);
          invert(i - 1, j);
          invert(i - 1, (j == 0) ? j + 1 : j - 1);
        }
      }
    }
    for (int64_t j = m - 1; j >= 2; j--) {
      if (s[0][j] == '1' && s[1][j] == '1') {
        invert(0, j);
        invert(1, j);
        invert(0, j - 1);
      } else if (s[0][j] == '1') {
        invert(0, j);
        invert(0, j - 1);
        invert(1, j - 1);
      } else if (s[1][j] == '1') {
        invert(1, j);
        invert(0, j - 1);
        invert(1, j - 1);
      }
    }
    vector<pair<int64_t, int64_t> > f, ot;
    for (int64_t i = 0; i < 2; i++) {
      for (int64_t j = 0; j < 2; j++) {
        if (s[i][j] == '1')
          f.push_back(make_pair(i, j));
        else
          ot.push_back(make_pair(i, j));
      }
    }
    if (f.size() == 0) {
    } else if (f.size() == 1) {
      assert(ot.size() == 3);
      invert(f[0]);
      invert(ot[0]);
      invert(ot[1]);
      invert(f[0]);
      invert(ot[0]);
      invert(ot[2]);
      invert(f[0]);
      invert(ot[1]);
      invert(ot[2]);
    } else if (f.size() == 2) {
      assert(ot.size() == 2);
      invert(f[0]);
      invert(ot[0]);
      invert(ot[1]);
      invert(f[1]);
      invert(ot[0]);
      invert(ot[1]);
    } else if (f.size() == 3) {
      for (auto p : f) invert(p.first, p.second);
    } else if (f.size() == 4) {
      invert(0, 1);
      invert(1, 0);
      invert(1, 1);
      invert(0, 0);
      invert(1, 0);
      invert(1, 1);
      invert(0, 0);
      invert(0, 1);
      invert(1, 1);
      invert(0, 0);
      invert(0, 1);
      invert(1, 0);
    }
  }
  void printAns() {
    assert(ans.size() % 6 == 0);
    int64_t q = ans.size() / 6;
    assert(q <= n * m);
    for (int64_t i = 0; i < n; i++) {
      for (int64_t j = 0; j < m; j++) {
        assert(s[i][j] == '0');
      }
    }
    cout << q << "\n";
    for (int64_t i = 0; i < q; i++) {
      for (int64_t j = 0; j < 6; j++) cout << ans[6 * i + j] + 1 << " ";
      cout << "\n";
    }
  }
};
void solve() {
  int64_t n, m;
  cin >> n >> m;
  Solver s(n, m);
  for (int64_t i = 0; i < n; i++) {
    cin >> s.s[i];
  }
  s.solve();
  s.printAns();
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int64_t casesNum;
  cin >> casesNum;
  for (int64_t caseId = 1; caseId <= casesNum; caseId++) {
    solve();
  }
  return 0;
}
