#include <bits/stdc++.h>
using namespace std;
struct Node {
  int ay, ax, by, bx, cy, cx;
};
int T;
int N, M;
int g[111][111];
vector<Node> res;
void f(int ay, int ax, int by, int bx, int cy, int cx) {
  res.push_back({ay, ax, by, bx, cy, cx});
  g[ay][ax] ^= 1;
  g[by][bx] ^= 1;
  g[cy][cx] ^= 1;
}
int main() {
  scanf("%d", &T);
  while (T--) {
    res.clear();
    scanf("%d %d", &N, &M);
    for (int i = 0; i < N; i++)
      for (int j = 0; j < M; j++) scanf("%1d", &g[i][j]);
    if (N == 2 && M == 2) {
      if (g[0][0] && !g[0][1] && !g[1][0] && !g[1][1]) {
        f(0, 0, 0, 1, 1, 0);
        f(0, 0, 0, 1, 1, 1);
        f(0, 0, 1, 0, 1, 1);
        for (int i = 0; i < N; i++)
          for (int j = 0; j < M; j++) assert(g[i][j] == 0);
      } else if (!g[0][0] && !g[0][1] && g[1][0] && !g[1][1]) {
        f(0, 0, 1, 0, 1, 1);
        f(1, 0, 0, 0, 0, 1);
        f(1, 0, 1, 1, 0, 1);
        for (int i = 0; i < N; i++)
          for (int j = 0; j < M; j++) assert(g[i][j] == 0);
      } else if (g[0][0] && !g[0][1] && g[1][0] && g[1][1]) {
        f(0, 0, 1, 0, 1, 1);
        for (int i = 0; i < N; i++)
          for (int j = 0; j < M; j++) assert(g[i][j] == 0);
      }
    }
    for (int i = 0; i < N - 2; i++) {
      for (int j = 0; j < M; j++) {
        if (g[i][j]) {
          if (j + 1 < M)
            f(i, j, i + 1, j, i + 1, j + 1);
          else
            f(i, j, i + 1, j, i + 1, j - 1);
        }
      }
    }
    for (int j = 0; j < M - 2; j++) {
      if (g[N - 2][j] && g[N - 1][j])
        f(N - 2, j, N - 1, j, N - 2, j + 1);
      else if (g[N - 2][j])
        f(N - 2, j, N - 2, j + 1, N - 1, j + 1);
      else if (g[N - 1][j])
        f(N - 1, j, N - 2, j + 1, N - 1, j + 1);
    }
    if (g[N - 2][M - 2] && !g[N - 2][M - 1] && !g[N - 1][M - 2] &&
        !g[N - 1][M - 1]) {
      f(N - 2, M - 2, N - 2, M - 1, N - 1, M - 2);
      f(N - 2, M - 2, N - 2, M - 1, N - 1, M - 1);
      f(N - 2, M - 2, N - 1, M - 2, N - 1, M - 1);
    } else if (!g[N - 2][M - 2] && !g[N - 2][M - 1] && g[N - 1][M - 2] &&
               !g[N - 1][M - 1]) {
      f(N - 2, M - 2, N - 1, M - 2, N - 1, M - 1);
      f(N - 1, M - 2, N - 2, M - 2, N - 2, M - 1);
      f(N - 1, M - 2, N - 1, M - 1, N - 2, M - 1);
    } else if (g[N - 2][M - 2] && !g[N - 2][M - 1] && g[N - 1][M - 2] &&
               g[N - 1][M - 1]) {
      f(N - 2, M - 2, N - 1, M - 2, N - 1, M - 1);
    } else {
      int j = M - 2;
      if (g[N - 2][j] && g[N - 1][j])
        f(N - 2, j, N - 1, j, N - 2, j + 1);
      else if (g[N - 2][j])
        f(N - 2, j, N - 2, j + 1, N - 1, j + 1);
      else if (g[N - 1][j])
        f(N - 1, j, N - 2, j + 1, N - 1, j + 1);
    }
    if (g[N - 2][M - 1] && g[N - 1][M - 1]) {
      f(N - 2, M - 2, N - 2, M - 1, N - 1, M - 1);
      f(N - 2, M - 2, N - 1, M - 2, N - 2, M - 1);
      f(N - 2, M - 2, N - 2, M - 1, N - 1, M - 1);
      f(N - 2, M - 2, N - 1, M - 2, N - 1, M - 1);
    } else if (g[N - 2][M - 1]) {
      f(N - 2, M - 2, N - 2, M - 1, N - 1, M - 1);
      f(N - 1, M - 2, N - 2, M - 2, N - 2, M - 1);
      f(N - 1, M - 2, N - 1, M - 1, N - 2, M - 1);
    } else if (g[N - 1][M - 1]) {
      f(N - 2, M - 1, N - 1, M - 2, N - 1, M - 1);
      f(N - 2, M - 2, N - 2, M - 1, N - 1, M - 1);
      f(N - 2, M - 2, N - 1, M - 2, N - 1, M - 1);
    }
    for (int i = 0; i < N; i++)
      for (int j = 0; j < M; j++) assert(g[i][j] == 0);
    printf("%d\n", res.size());
    for (auto &it : res) {
      printf("%d %d %d %d %d %d\n", it.ay + 1, it.ax + 1, it.by + 1, it.bx + 1,
             it.cy + 1, it.cx + 1);
    }
  }
  return 0;
}
