#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100;
int TC, N, M;
int A[MAXN + 10][MAXN + 10];
vector<int> adj[20];
int par[20];
vector<pair<int, int>> AA[20];
int main() {
  scanf("%d", &TC);
  for (int j = 0; j < 16; j++) {
    if (__builtin_popcount(j) == 3) {
      if (j & 1) AA[j].push_back({1, 1});
      if (j & 2) AA[j].push_back({1, 2});
      if (j & 4) AA[j].push_back({2, 1});
      if (j & 8) AA[j].push_back({2, 2});
    }
  }
  for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
      if (__builtin_popcount(j) == 3) {
        adj[i].push_back(i ^ j);
      }
    }
  }
  memset(par, -1, sizeof(par));
  par[0] = 0;
  queue<int> Q;
  Q.push(0);
  while (!Q.empty()) {
    int now = Q.front();
    Q.pop();
    for (auto nxt : adj[now]) {
      if (par[nxt] != -1) continue;
      par[nxt] = now;
      Q.push(nxt);
    }
  }
  while (TC--) {
    scanf("%d%d", &N, &M);
    for (int i = 1; i <= N; i++)
      for (int j = 1; j <= M; j++) scanf("%1d", &A[i][j]);
    vector<vector<pair<int, int>>> V;
    for (int i = M; i >= 3; i--) {
      for (int j = 1; j <= N - 1; j++) {
        int a = A[j][i], b = A[j + 1][i];
        if (a && b) {
          vector<pair<int, int>> t;
          t.push_back({j, i});
          t.push_back({j + 1, i});
          t.push_back({j, i - 1});
          V.push_back(t);
          A[j][i] ^= 1;
          A[j + 1][i] ^= 1;
          A[j][i - 1] ^= 1;
        } else if (a) {
          V.push_back({{j, i}, {j + 1, i - 1}, {j, i - 1}});
          A[j][i] ^= 1;
          A[j + 1][i - 1] ^= 1;
          A[j][i - 1] ^= 1;
        } else if (b) {
          V.push_back({{j + 1, i}, {j + 1, i - 1}, {j, i - 1}});
          A[j + 1][i] ^= 1;
          A[j + 1][i - 1] ^= 1;
          A[j][i - 1] ^= 1;
        }
      }
    }
    for (int i = N; i >= 3; i--) {
      int j = 1;
      int a = A[i][j], b = A[i][j + 1];
      if (a && b) {
        vector<pair<int, int>> t;
        t.push_back({i, j});
        t.push_back({i, j + 1});
        t.push_back({i - 1, j});
        V.push_back(t);
        A[i][j] ^= 1;
        A[i][j + 1] ^= 1;
        A[i - 1][j] ^= 1;
      } else if (a) {
        V.push_back({{i, j}, {i - 1, j + 1}, {i - 1, j}});
        A[i][j] ^= 1;
        A[i - 1][j + 1] ^= 1;
        A[i - 1][j] ^= 1;
      } else if (b) {
        V.push_back({{i, j + 1}, {i - 1, j + 1}, {i - 1, j}});
        A[i][j + 1] ^= 1;
        A[i - 1][j + 1] ^= 1;
        A[i - 1][j] ^= 1;
      }
    }
    int mask = 0;
    if (A[1][1]) mask |= 1;
    if (A[1][2]) mask |= 2;
    if (A[2][1]) mask |= 4;
    if (A[2][2]) mask |= 8;
    while (mask) {
      int t = mask ^ par[mask];
      V.push_back(AA[t]);
      mask = par[mask];
    }
    printf("%d\n", V.size());
    for (auto it : V) {
      for (auto jt : it) printf("%d %d ", jt.first, jt.second);
      printf("\n");
    }
  }
}
