#include <bits/stdc++.h>
using namespace std;
const int dydis = 101;
bool mas[dydis][dydis] = {0};
int n, m;
vector<pair<int, int>> ans;
void inv(int e, int s) {
  mas[e][s] = !mas[e][s];
  ans.push_back({e, s});
}
void pushD(int e, int s) {
  if (mas[e][s] == 0) return;
  inv(e, s);
  inv(e + 1, s);
  if (s == m - 1)
    inv(e + 1, s - 1);
  else
    inv(e + 1, s + 1);
}
void pushK(int e, int s) {
  if (mas[e][s] == 0) return;
  inv(e, s);
  inv(e, s - 1);
  if (e == n - 1)
    inv(e - 1, s - 1);
  else
    inv(e + 1, s - 1);
}
map<vector<int>, int> dist;
map<vector<int>, vector<int>> came;
map<vector<int>, vector<pair<int, int>>> how;
pair<int, int> kas(int sk) {
  int ant = sk % 2;
  sk /= 2;
  int prm = sk % 2;
  return {prm, ant};
}
void br() {
  queue<vector<int>> q;
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      for (int h = 0; h < 2; h++) {
        for (int l = 0; l < 2; l++) {
          vector<int> bb(4);
          bb[0] = i;
          bb[1] = j;
          bb[2] = h;
          bb[3] = l;
          dist[bb] = 20;
        }
      }
    }
  }
  vector<int> nl = {0, 0, 0, 0};
  q.push(nl);
  dist[nl] = 0;
  while (!q.empty()) {
    vector<int> bs = q.front();
    q.pop();
    for (int i = 0; i < 4; i++) {
      for (int j = i + 1; j < 4; j++) {
        for (int k = j + 1; k < 4; k++) {
          vector<int> cp = bs;
          cp[i] = !cp[i];
          cp[j] = !cp[j];
          cp[k] = !cp[k];
          if (dist[cp] > dist[bs] + 1) {
            dist[cp] = dist[bs] + 1;
            vector<pair<int, int>> hw;
            hw.push_back(kas(i));
            hw.push_back(kas(j));
            hw.push_back(kas(k));
            how[cp] = hw;
            came[cp] = bs;
            q.push(cp);
          }
        }
      }
    }
  }
}
void fix(int e, int s) {
  vector<int> sitas = {mas[e][s], mas[e][s + 1], mas[e + 1][s],
                       mas[e + 1][s + 1]};
  vector<int> nul = {0, 0, 0, 0};
  while (sitas != nul) {
    auto hw = how[sitas];
    for (auto x : hw) ans.push_back({x.first + e, x.second + s});
    sitas = came[sitas];
  }
}
int main() {
  br();
  cin.tie(NULL);
  ios_base::sync_with_stdio(false);
  int t;
  cin >> t;
  while (t--) {
    ans.clear();
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        char a;
        cin >> a;
        mas[i][j] = a == '1';
      }
    }
    for (int i = 0; i < n - 2; i++) {
      for (int j = 0; j < m; j++) {
        pushD(i, j);
      }
    }
    for (int j = m - 1; j > 1; j--) {
      for (int i = n - 1; i >= n - 2; i--) {
        pushK(i, j);
      }
    }
    fix(n - 2, 0);
    cout << ans.size() / 3 << "\n";
    for (int i = 0; i < ans.size(); i++) {
      cout << ans[i].first + 1 << " " << ans[i].second + 1 << " ";
      if (i % 3 == 2) cout << "\n";
    }
  }
  return 0;
}
