#include <bits/stdc++.h>
using namespace std;
map<string, vector<tuple<long long, long long, long long>>> dp;
void solve() {
  queue<string> Q;
  Q.push("0000");
  dp["0000"] = vector<tuple<long long, long long, long long>>();
  long long len = 4;
  while (!Q.empty()) {
    string s = Q.front();
    Q.pop();
    for (long long i = (long long)(0); i <= (long long)(len - 1); i++)
      for (long long j = (long long)(i + 1); j <= (long long)(len - 1); j++)
        for (long long k = (long long)(j + 1); k <= (long long)(len - 1); k++) {
          string p = s;
          p[i] = (s[i] == '0') ? '1' : '0';
          p[j] = (s[j] == '0') ? '1' : '0';
          p[k] = (s[k] == '0') ? '1' : '0';
          if (dp.find(p) != dp.end()) continue;
          vector<tuple<long long, long long, long long>> v = dp[s];
          v.push_back({i, j, k});
          dp[p] = v;
          Q.push(p);
        }
  }
}
vector<long long> unzip(tuple<long long, long long, long long> op, long long x,
                        long long y) {
  long long i = get<0>(op), j = get<1>(op), k = get<2>(op);
  vector<long long> w = {i, j, k}, v;
  for (long long it : w) {
    if (it == 0) {
      v.push_back(x);
      v.push_back(y);
    } else if (it == 1) {
      v.push_back(x);
      v.push_back(y + 1);
    } else if (it == 2) {
      v.push_back(x + 1);
      v.push_back(y);
    } else if (it == 3) {
      v.push_back(x + 1);
      v.push_back(y + 1);
    }
  }
  return v;
}
void swap(char &c) { c = (c == '0') ? '1' : '0'; }
int main() {
  solve();
  long long t;
  cin >> t;
  while (t--) {
    long long n, m;
    cin >> n >> m;
    char a[n + 1][m + 1];
    char cp[n + 1][m + 1];
    for (long long i = (long long)(1); i <= (long long)(n); i++)
      for (long long j = (long long)(1); j <= (long long)(m); j++) {
        cin >> a[i][j];
        cp[i][j] = a[i][j];
      }
    vector<vector<long long>> ans1, ans2;
    for (long long i = 1; i <= n; i += 2) {
      if (i == n) i--;
      for (long long j = 1; j < m; j++) {
        if (j + 1 == m) {
          string s = string(1, a[i][j]) + string(1, a[i][j + 1]) +
                     string(1, a[i + 1][j]) + string(1, a[i + 1][j + 1]);
          vector<tuple<long long, long long, long long>> op = dp[s];
          reverse((op).begin(), (op).end());
          assert(op.size() <= 4);
          for (auto it : op) ans1.push_back(unzip(it, i, j));
          a[i][j] = a[i + 1][j] = a[i][j + 1] = a[i + 1][j + 1] = '0';
        } else {
          if (a[i][j] == '0' && a[i + 1][j] == '0') continue;
          vector<long long> col;
          if (a[i][j] == '1') {
            col.push_back(i);
            col.push_back(j);
          }
          if (a[i + 1][j] == '1') {
            col.push_back(i + 1);
            col.push_back(j);
          }
          a[i][j] = a[i + 1][j] = '0';
          if (a[i][j + 1] == '1' || col.size() == 2) {
            col.push_back(i);
            col.push_back(j + 1);
            swap(a[i][j + 1]);
          }
          if (col.size() == 4) {
            col.push_back(i + 1);
            col.push_back(j + 1);
            swap(a[i + 1][j + 1]);
          }
          ans1.push_back(col);
        }
      }
    }
    for (long long i = (long long)(1); i <= (long long)(n); i++)
      for (long long j = (long long)(1); j <= (long long)(m); j++)
        a[i][j] = cp[i][j];
    for (long long j = 1; j <= m; j += 2) {
      if (j == m) j--;
      for (long long i = 1; i < n; i++) {
        if (i + 1 == n) {
          string s = string(1, a[i][j]) + string(1, a[i][j + 1]) +
                     string(1, a[i + 1][j]) + string(1, a[i + 1][j + 1]);
          vector<tuple<long long, long long, long long>> op = dp[s];
          reverse((op).begin(), (op).end());
          assert(op.size() <= 4);
          for (auto it : op) ans2.push_back(unzip(it, i, j));
          a[i][j] = a[i + 1][j] = a[i][j + 1] = a[i + 1][j + 1] = '0';
        } else {
          if (a[i][j] == '0' && a[i][j + 1] == '0') continue;
          vector<long long> col;
          if (a[i][j] == '1') {
            col.push_back(i);
            col.push_back(j);
          }
          if (a[i][j + 1] == '1') {
            col.push_back(i);
            col.push_back(j + 1);
          }
          a[i][j] = a[i][j + 1] = '0';
          if (a[i + 1][j] == '1' || col.size() == 2) {
            col.push_back(i + 1);
            col.push_back(j);
            swap(a[i + 1][j]);
          }
          if (col.size() == 4) {
            col.push_back(i + 1);
            col.push_back(j + 1);
            swap(a[i + 1][j + 1]);
          }
          ans2.push_back(col);
        }
      }
    }
    vector<vector<long long>> ans = ans1;
    if (ans.size() > ans2.size()) ans = ans2;
    cout << ans.size() << "\n";
    for (auto it : ans) {
      for (long long x : it) cout << x << ' ';
      cout << '\n';
    }
  }
}
