#include <bits/stdc++.h>
#pragma GCC optimize(4)
using namespace std;
char _buf[100000], *_p1 = _buf, *_p2 = _buf;
inline int gi() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return (f == 1) ? x : -x;
}
inline int max(int a, int b) { return a > b ? a : b; }
inline int min(int a, int b) { return a < b ? a : b; }
int T, n, m;
struct node {
  int x[3], y[3];
  node(int a1, int b1, int a2, int b2, int a3, int b3) {
    x[0] = a1, x[1] = a2, x[2] = a3;
    y[0] = b1, y[1] = b2, y[2] = b3;
  }
  inline void output() {
    for (int i = 0; i <= 2; ++i) printf("%d %d ", x[i], y[i]);
  }
};
const int maxn = 105;
vector<node> vec;
int a[maxn][maxn];
char s[maxn];
inline void init() {
  memset(a, 0, sizeof(a));
  vec.clear();
}
inline void input() {
  n = gi(), m = gi();
  for (int i = 1; i <= n; ++i) {
    scanf("%s", s + 1);
    for (int j = 1; j <= m; ++j) a[i][j] = s[j] - '0';
  }
}
inline void change(int a1, int b1, int a2, int b2, int a3, int b3) {
  vec.push_back(node(a1, b1, a2, b2, a3, b3));
  a[a1][b1] ^= 1, a[a2][b2] ^= 1, a[a3][b3] ^= 1;
}
inline void solve() {
  for (int i = 1; i <= n - 2; ++i) {
    for (int j = 1; j <= m - 1; ++j) {
      if (a[i][j] == 0 && a[i][j + 1] == 0)
        continue;
      else {
        if (a[i][j] == 0) {
          change(i, j + 1, i + 1, j, i + 1, j + 1);
        } else if (a[i][j + 1] == 1) {
          change(i, j, i, j + 1, i + 1, j);
        } else {
          change(i, j, i + 1, j, i + 1, j + 1);
        }
      }
    }
  }
  for (int i = 1; i <= m - 1; ++i) {
    if (a[n - 1][i] == 1 && a[n][i] == 1) {
      change(n - 1, i, n, i, n - 1, i + 1);
    } else if (a[n - 1][i] == 1) {
      change(n - 1, i, n, i + 1, n - 1, i + 1);
    } else if (a[n][i] == 1) {
      change(n, i, n - 1, i + 1, n, i + 1);
    }
  }
  if (a[n][m] == 1 && a[n - 1][m] == 1) {
    change(n - 1, m - 1, n - 1, m, n, m - 1);
    change(n - 1, m - 1, n, m - 1, n, m);
  } else if (a[n - 1][m] == 1) {
    change(n - 1, m, n - 1, m - 1, n, m - 1);
    change(n - 1, m - 1, n, m, n - 1, m);
    change(n, m - 1, n, m, n - 1, m);
  } else if (a[n][m] == 1) {
    change(n, m, n - 1, m - 1, n, m - 1);
    change(n - 1, m - 1, n, m, n - 1, m);
    change(n, m - 1, n, m, n - 1, m);
  }
  printf("%d\n", (int)(vec.size()));
  for (auto x : vec) {
    x.output();
    printf("\n");
  }
}
int main() {
  T = gi();
  while (T--) {
    init();
    input();
    solve();
  }
  return 0;
}
