#include <bits/stdc++.h>
using namespace std;
template <typename _Tp>
inline void red(_Tp &x) {
  x = 0;
  bool fg = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') fg ^= 1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    x = (x << 1) + (x << 3) + (_Tp)(ch ^ 48), ch = getchar();
  if (fg) x = -x;
}
template <typename _Tp>
bool umax(_Tp &x, _Tp y) {
  return (x < y) ? (x = y, true) : (false);
}
template <typename _Tp>
bool umin(_Tp &x, _Tp y) {
  return (x > y) ? (x = y, true) : (false);
}
const int N = 105;
int T, n, m, c[N][N];
char s[N][N];
struct dat {
  int a, b, c, d, e, f;
} ans[N * N * 3];
int tot;
void doit(int x, int y, int id) {
  if (id == 0) {
    ans[++tot] = {x + 1, y, x + 1, y + 1, x, y + 1};
  }
  if (id == 1) {
    ans[++tot] = {x, y, x + 1, y, x + 1, y + 1};
  }
  if (id == 2) {
    ans[++tot] = {x, y, x, y + 1, x + 1, y + 1};
  }
  if (id == 3) {
    ans[++tot] = {x, y, x + 1, y, x, y + 1};
  }
  c[ans[tot].a][ans[tot].b] ^= 1;
  c[ans[tot].c][ans[tot].d] ^= 1;
  c[ans[tot].e][ans[tot].f] ^= 1;
}
void print() {
  printf("----\n");
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      printf("%d ", c[i][j]);
    }
    printf("\n");
  }
}
void work(int x, int y) {
  int w = (c[x][y] << 3) | (c[x][y + 1] << 2) | (c[x + 1][y] << 1) |
          c[x + 1][y + 1];
  switch (w) {
    case 0:
      break;
    case 1:
      doit(x, y, 0);
      doit(x, y, 1);
      doit(x, y, 2);
      break;
    case 2:
      doit(x, y, 0);
      doit(x, y, 1);
      doit(x, y, 3);
      break;
    case 3:
      doit(x, y, 3);
      doit(x, y, 2);
      break;
    case 4:
      doit(x, y, 0);
      doit(x, y, 3);
      doit(x, y, 2);
      break;
    case 5:
      doit(x, y, 1);
      doit(x, y, 3);
      break;
    case 6:
      doit(x, y, 1);
      doit(x, y, 2);
      break;
    case 7:
      doit(x, y, 0);
      break;
    case 8:
      doit(x, y, 3);
      doit(x, y, 1);
      doit(x, y, 2);
      break;
    case 9:
      doit(x, y, 0);
      doit(x, y, 3);
      break;
    case 10:
      doit(x, y, 0);
      doit(x, y, 2);
      break;
    case 11:
      doit(x, y, 1);
      break;
    case 12:
      doit(x, y, 0);
      doit(x, y, 1);
      break;
    case 13:
      doit(x, y, 2);
      break;
    case 14:
      doit(x, y, 3);
      break;
    case 15:
      doit(x, y, 0);
      doit(x, y, 1);
      doit(x, y, 2);
      doit(x, y, 3);
      break;
  }
}
int main() {
  red(T);
  while (T--) {
    red(n);
    red(m);
    tot = 0;
    for (int i = 1; i <= n; ++i) {
      scanf("%s", s[i] + 1);
      for (int j = 1; j <= m; ++j) c[i][j] = (s[i][j] - '0');
    }
    if (m & 1) {
      for (int i = 1; i + 1 <= n; i += 2) {
        if (c[i][m] && c[i + 1][m])
          doit(i, m - 1, 0);
        else if (c[i][m] && c[i + 1][m] == 0)
          doit(i, m - 1, 3);
        else if (c[i][m] == 0 && c[i + 1][m])
          doit(i, m - 1, 1);
      }
      if ((n & 1) && c[n][m] == 1) doit(n - 1, m - 1, 1);
    }
    if (n & 1) {
      for (int i = 1; i + 1 <= m; i += 2) {
        if (c[n][i] && c[n][i + 1])
          doit(n - 1, i, 1);
        else if (c[n][i] && c[n][i + 1] == 0)
          doit(n - 1, i, 3);
        else if (c[n][i] == 0 && c[n][i + 1])
          doit(n - 1, i, 2);
      }
    }
    for (int i = 1; i + 1 <= n; i += 2) {
      for (int j = 1; j + 1 <= m; j += 2) {
        work(i, j);
      }
    }
    printf("%d\n", tot);
    for (int i = 1; i <= tot; ++i) {
      printf("%d %d %d %d %d %d\n", ans[i].a, ans[i].b, ans[i].c, ans[i].d,
             ans[i].e, ans[i].f);
    }
  }
  return 0;
}
