#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
struct ANS {
  int xa, ya, xb, yb, xc, yc;
};
struct PRE {
  int p1, p2, s;
} pre[MAXN][2][2];
int T, n, m;
int a[MAXN][MAXN];
int f[MAXN][2][2];
char s[MAXN];
vector<ANS> ans;
int popcount(int v) { return v ? popcount(v - (v & -v)) + 1 : 0; }
void operate(int x, int y, int nx, int ny, bool flag = 0) {
  if (flag) ans.push_back((ANS){0, 0, 0, 0, 0, 0});
  for (int i = 0; i <= 1; i++)
    for (int j = 0; j <= 1; j++)
      if (x + i != nx || j + y != ny) {
        if (flag) {
          if (ans.back().xa) {
            if (ans.back().xb) {
              ans.back().xc = x + i;
              ans.back().yc = y + j;
            } else {
              ans.back().xb = x + i;
              ans.back().yb = y + j;
            }
          } else {
            ans.back().xa = x + i;
            ans.back().ya = y + j;
          }
        }
        a[x + i][y + j] ^= 1;
      }
}
int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
      scanf("%s", s + 1);
      for (int j = 1; j <= m; j++) a[i][j] = s[j] - '0';
    }
    ans.clear();
    for (int i = 1; i <= n - 2; i++)
      for (int j = 1; j <= m; j++)
        if (a[i][j]) {
          if (j < m)
            operate(i, j, i, j + 1, 1);
          else
            operate(i, j - 1, i, j - 1, 1);
        }
    for (int i = 1; i <= m; i++)
      for (int j = 0; j <= 1; j++)
        for (int k = 0; k <= 1; k++) f[i][j][k] = 1e9;
    f[1][a[n - 1][1]][a[n][1]] = 0;
    for (int i = 1; i < m; i++)
      for (int j = 0; j <= 1; j++)
        for (int k = 0; k <= 1; k++)
          if (f[i][j][k] != 1e9) {
            int t1 = a[n - 1][i], t2 = a[n][i];
            a[n - 1][i] = j;
            a[n][i] = k;
            for (int l = 0; l < 16; l++) {
              if (l & 1) operate(n - 1, i, n - 1, i);
              if (l >> 1 & 1) operate(n - 1, i, n, i);
              if (l >> 2 & 1) operate(n - 1, i, n - 1, i + 1);
              if (l >> 3 & 1) operate(n - 1, i, n, i + 1);
              if (!a[n - 1][i] && !a[n][i] &&
                  f[i + 1][a[n - 1][i + 1]][a[n][i + 1]] >
                      f[i][j][k] + popcount(l)) {
                f[i + 1][a[n - 1][i + 1]][a[n][i + 1]] =
                    f[i][j][k] + popcount(l);
                pre[i + 1][a[n - 1][i + 1]][a[n][i + 1]] = (PRE){j, k, l};
              }
              if (l & 1) operate(n - 1, i, n - 1, i);
              if (l >> 1 & 1) operate(n - 1, i, n, i);
              if (l >> 2 & 1) operate(n - 1, i, n - 1, i + 1);
              if (l >> 3 & 1) operate(n - 1, i, n, i + 1);
            }
            a[n - 1][i] = t1;
            a[n][i] = t2;
          }
    int t1 = 0, t2 = 0;
    for (int i = m; i > 1; i--) {
      int l = pre[i][t1][t2].s;
      if (l & 1) operate(n - 1, i - 1, n - 1, i - 1, 1);
      if (l >> 1 & 1) operate(n - 1, i - 1, n, i - 1, 1);
      if (l >> 2 & 1) operate(n - 1, i - 1, n - 1, i, 1);
      if (l >> 3 & 1) operate(n - 1, i - 1, n, i, 1);
      int n1 = pre[i][t1][t2].p1, n2 = pre[i][t1][t2].p2;
      t1 = n1;
      t2 = n2;
    }
    printf("%d\n", (int)ans.size());
    for (int i = 0; i < ans.size(); i++)
      printf("%d %d %d %d %d %d\n", ans[i].xa, ans[i].ya, ans[i].xb, ans[i].yb,
             ans[i].xc, ans[i].yc);
  }
  return 0;
}
