#include <bits/stdc++.h>
using namespace std;
long long Min(long long x, long long y) {
  if (x < y) return x;
  return y;
}
long long Max(long long x, long long y) {
  if (x > y) return x;
  return y;
}
long long read() {
  long long s = 0, h = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') h = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    s = s * 10 + c - '0';
    c = getchar();
  }
  return s * h;
}
void write(long long x) {
  if (x > 9) {
    short int tmp = x % 10;
    write(x / 10);
    putchar(tmp + '0');
  } else
    putchar(x + '0');
}
long long Pow(long long x, long long y, long long p) {
  long long ans = 1;
  while (y) {
    if (y & 1) ans = ans * x % p;
    x = x * x % p;
    y >>= 1;
  }
  return ans;
}
long long cread() {
  char c = getchar();
  while (c < '0' || c > '1') c = getchar();
  return c - '0';
}
struct Node {
  long long a, b, c, d, e, f;
} nd[105 * 105 * 4];
long long T, n, m, a[105][105], tot;
void Upd(long long X1, long long Y1, long long X2, long long Y2, long long X3,
         long long Y3) {
  nd[++tot] = (Node){X1, Y1, X2, Y2, X3, Y3};
  a[X1][Y1] ^= 1;
  a[X2][Y2] ^= 1;
  a[X3][Y3] ^= 1;
}
char s[105][105];
int main() {
  long long T = read();
  while (T--) {
    n = read();
    m = read();
    tot = 0;
    for (int i = 1; i <= n; i++) {
      scanf("%s", s[i] + 1);
      for (int j = 1; j <= m; j++) {
        a[i][j] = s[i][j] - '0';
      }
    }
    for (int i = 1; i + 1 < n; i++) {
      for (int j = 1; j < m; j++) {
        if (a[i][j]) {
          if (a[i][j + 1]) {
            Upd(i, j, i, j + 1, i + 1, j);
          } else {
            Upd(i, j, i + 1, j, i + 1, j + 1);
          }
        }
      }
      if (a[i][m]) {
        Upd(i, m, i + 1, m - 1, i + 1, m);
      }
    }
    for (int j = 1; j < m; j++) {
      if (a[n - 1][j]) {
        if (a[n][j]) {
          Upd(n - 1, j, n, j, n, j + 1);
        } else {
          Upd(n - 1, j, n - 1, j + 1, n, j + 1);
        }
      }
      if (a[n][j]) {
        Upd(n, j, n, j + 1, n - 1, j + 1);
      }
    }
    if (a[n - 1][m] & a[n][m]) {
      Upd(n - 1, m - 1, n, m - 1, n, m);
      Upd(n - 1, m - 1, n, m - 1, n - 1, m);
    } else if (a[n - 1][m]) {
      Upd(n - 1, m - 1, n, m - 1, n - 1, m);
      Upd(n - 1, m, n, m, n - 1, m - 1);
      Upd(n - 1, m, n, m, n, m - 1);
    } else if (a[n][m]) {
      Upd(n - 1, m - 1, n, m - 1, n, m);
      Upd(n - 1, m, n, m, n - 1, m - 1);
      Upd(n - 1, m, n, m, n, m - 1);
    }
    printf("%lld\n", tot);
    for (int i = 1; i <= tot; i++) {
      printf("%lld %lld %lld %lld %lld %lld\n", nd[i].a, nd[i].b, nd[i].c,
             nd[i].d, nd[i].e, nd[i].f);
    }
  }
  return 0;
}
