#include <bits/stdc++.h>
using namespace std;
inline int max(int x, int y) { return (x > y ? x : y); }
inline int min(int x, int y) { return (x < y ? x : y); }
inline int read() {
  int x = 0;
  char c = getchar();
  bool y = 1;
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') y = 0;
  for (; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - 48;
  if (y) return x;
  return -x;
}
int n, m, K, a[210][210], t1, t2;
vector<pair<int, int> > B, C;
struct data {
  int f1, f2, f3, f4, f5, f6;
  data(const int X = 0, const int Y = 0, const int Z = 0, const int U = 0,
       const int V = 0, const int W = 0)
      : f1(X), f2(Y), f3(Z), f4(U), f5(V), f6(W) {}
} ans[200010];
inline bool get01() {
  char c = getchar();
  while (c != '0' && c != '1') c = getchar();
  return c - '0';
}
inline void work(data X) {
  a[X.f1][X.f2] ^= 1;
  a[X.f3][X.f4] ^= 1;
  a[X.f5][X.f6] ^= 1;
  ans[++K] = X;
  return;
}
inline void push(pair<int, int> A, pair<int, int> B, pair<int, int> C) {
  ans[++K] = data(A.first, A.second, B.first, B.second, C.first, C.second);
  return;
}
inline void Input() {
  K = 0;
  n = read(), m = read();
  for (register int i = 1; i <= n; ++i) {
    for (register int j = 1; j <= m; ++j) a[i][j] = get01();
  }
  return;
}
inline void solve() {
  for (register int j = 1; j + 1 <= m; j += 2) {
    for (register int i = 1; i < n - 1; ++i) {
      if (a[i][j] && a[i][j + 1]) {
        if (a[i + 1][j])
          work(data(i, j, i, j + 1, i + 1, j));
        else
          work(data(i, j, i, j + 1, i + 1, j + 1));
      } else if (a[i][j] || a[i][j + 1]) {
        if (a[i][j])
          work(data(i, j, i + 1, j, i + 1, j + 1));
        else
          work(data(i, j + 1, i + 1, j, i + 1, j + 1));
      }
    }
  }
  if (m & 1) {
    for (register int i = 1; i < n - 1; ++i) {
      int j = m - 1;
      if (a[i][j] && a[i][j + 1]) {
        if (a[i + 1][j])
          work(data(i, j, i, j + 1, i + 1, j));
        else
          work(data(i, j, i, j + 1, i + 1, j + 1));
      } else if (a[i][j] || a[i][j + 1]) {
        if (a[i][j])
          work(data(i, j, i + 1, j, i + 1, j + 1));
        else
          work(data(i, j + 1, i + 1, j, i + 1, j + 1));
      }
    }
  }
  for (register int j = 1; j < m - 1; ++j) {
    int i = n - 1;
    if (a[i][j] && a[i + 1][j]) {
      if (a[i][j + 1])
        work(data(i, j, i + 1, j, i, j + 1));
      else
        work(data(i, j, i + 1, j, i + 1, j + 1));
    } else if (a[i][j] || a[i + 1][j]) {
      if (a[i][j])
        work(data(i, j, i, j + 1, i + 1, j + 1));
      else
        work(data(i + 1, j, i, j + 1, i + 1, j + 1));
    }
  }
  for (register int i = n - 1; i <= n; ++i)
    for (register int j = m - 1; j <= m; ++j)
      if (a[i][j])
        B.push_back(make_pair(i, j));
      else
        C.push_back(make_pair(i, j));
  pair<int, int> X, Y, Z;
  if (!B.empty()) {
    if (B.size() == 4) {
      X = B.back();
      B.pop_back();
      C.push_back(X);
      Y = B.back();
      B.pop_back();
      C.push_back(Y);
      Z = B.back();
      B.pop_back();
      C.push_back(Z);
      push(X, Y, Z);
    }
    while (B.size() < 3) {
      pair<int, int> X = B.back(), Y, Z;
      B.pop_back();
      Y = C.back();
      C.pop_back();
      B.push_back(Y);
      Z = C.back();
      C.pop_back();
      B.push_back(Z);
      C.push_back(X);
      push(X, Y, Z);
    }
    push(B[0], B[1], B[2]);
  }
  B.clear(), C.clear();
  printf("%d\n", K);
  for (register int i = 1; i <= K; ++i)
    printf("%d %d %d %d %d %d\n", ans[i].f1, ans[i].f2, ans[i].f3, ans[i].f4,
           ans[i].f5, ans[i].f6);
  return;
}
int T;
int main() {
  T = read();
  while (T--) {
    Input();
    solve();
  }
  return 0;
}
