#include <bits/stdc++.h>
using namespace std;
const int maxn = 100;
int T, n, m, tot, board[maxn + 1][maxn + 1], x[3][maxn * maxn + 1],
    y[3][maxn * maxn + 1];
inline void push(int x1, int y1, int x2, int y2, int x3, int y3) {
  ++tot;
  x[0][tot] = x1;
  x[1][tot] = x2;
  x[2][tot] = x3;
  y[0][tot] = y1;
  y[1][tot] = y2;
  y[2][tot] = y3;
  return;
}
void solve(int i, int j) {
  int sum = 0;
  for (int k = i; k <= i + 1; ++k)
    for (int l = j; l <= j + 1; ++l) sum += board[k][l];
  if (sum == 1) {
    for (int k = i; k <= i + 1; ++k)
      for (int l = j; l <= j + 1; ++l)
        if (board[k][l]) {
          push(k, l, k - (k == i ? -1 : 1), l, k, l - (l == j ? -1 : 1));
          board[k][l] = 0;
          board[k - (k == i ? -1 : 1)][l] = board[k][l - (l == j ? -1 : 1)] = 1;
          solve(i, j);
          return;
        }
  } else if (sum == 2) {
    int x1 = 0, y1 = 0, x2 = 0, y2 = 0, x3 = 0, y3 = 0;
    for (int k = i; k <= i + 1; ++k)
      for (int l = j; l <= j + 1; ++l)
        if (board[k][l]) {
          if (!x1) board[x1 = k][y1 = l] = 0;
        } else if (!x2)
          board[x2 = k][y2 = l] = 1;
        else
          board[x3 = k][y3 = l] = 1;
    push(x1, y1, x2, y2, x3, y3);
    solve(i, j);
  } else if (sum == 3) {
    int x1 = 0, y1 = 0, x2 = 0, y2 = 0, x3 = 0, y3 = 0;
    for (int k = i; k <= i + 1; ++k)
      for (int l = j; l <= j + 1; ++l)
        if (board[k][l])
          if (!x1)
            board[x1 = k][y1 = l] = 0;
          else if (!x2)
            board[x2 = k][y2 = l] = 0;
          else
            board[x3 = k][y3 = l] = 0;
    push(x1, y1, x2, y2, x3, y3);
  } else if (sum == 4) {
    push(i, j, i + 1, j, i, j + 1);
    board[i][j] = board[i + 1][j] = board[i][j + 1] = 0;
    solve(i, j);
  }
  return;
}
int main() {
  scanf("%d", &T);
  while (T--) {
    tot = 0;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i)
      for (int j = 1; j <= m; ++j) scanf("%1d", &board[i][j]);
    if (n & 1 && m & 1) {
      if (board[n][m]) {
        board[n][m] ^= 1;
        board[n - 1][m] ^= 1;
        board[n][m - 1] ^= 1;
        push(n, m, n - 1, m, n, m - 1);
      }
      for (int i = 1; i < n; i += 2)
        if (board[i][m] == 1 && board[i + 1][m] == 1) {
          board[i][m] = board[i + 1][m] = 0;
          board[i][m - 1] ^= 1;
          push(i, m, i + 1, m, i, m - 1);
        } else if (board[i][m]) {
          board[i][m] = 0;
          board[i][m - 1] ^= 1;
          board[i + 1][m - 1] ^= 1;
          push(i, m, i, m - 1, i + 1, m - 1);
        } else if (board[i + 1][m]) {
          board[i + 1][m] = 0;
          board[i][m - 1] ^= 1;
          board[i + 1][m - 1] ^= 1;
          push(i + 1, m, i, m - 1, i + 1, m - 1);
        }
      for (int i = 1; i < m; i += 2)
        if (board[n][i] == 1 && board[n][i + 1] == 1) {
          board[n][i] = board[n][i + 1] = 0;
          board[n - 1][i] ^= 1;
          push(n, i, n, i + 1, n - 1, i);
        } else if (board[n][i]) {
          board[n][i] = 0;
          board[n - 1][i] ^= 1;
          board[n - 1][i + 1] ^= 1;
          push(n, i, n - 1, i, n - 1, i + 1);
        } else if (board[n][i + 1]) {
          board[n][i + 1] = 0;
          board[n - 1][i] ^= 1;
          board[n - 1][i + 1] ^= 1;
          push(n, i + 1, n - 1, i, n - 1, i + 1);
        }
      --n;
      --m;
    } else if (m & 1) {
      for (int i = 1; i <= n; i += 2)
        if (board[i][m] == 1 && board[i + 1][m] == 1) {
          board[i][m] = board[i + 1][m] = 0;
          board[i][m - 1] ^= 1;
          push(i, m, i + 1, m, i, m - 1);
        } else if (board[i][m]) {
          board[i][m] = 0;
          board[i][m - 1] ^= 1;
          board[i + 1][m - 1] ^= 1;
          push(i, m, i, m - 1, i + 1, m - 1);
        } else if (board[i + 1][m]) {
          board[i + 1][m] = 0;
          board[i][m - 1] ^= 1;
          board[i + 1][m - 1] ^= 1;
          push(i + 1, m, i, m - 1, i + 1, m - 1);
        }
      --m;
    } else if (n & 1) {
      for (int i = 1; i <= m; i += 2)
        if (board[n][i] == 1 && board[n][i + 1] == 1) {
          board[n][i] = board[n][i + 1] = 0;
          board[n - 1][i] ^= 1;
          push(n, i, n, i + 1, n - 1, i);
        } else if (board[n][i]) {
          board[n][i] = 0;
          board[n - 1][i] ^= 1;
          board[n - 1][i + 1] ^= 1;
          push(n, i, n - 1, i, n - 1, i + 1);
        } else if (board[n][i + 1]) {
          board[n][i + 1] = 0;
          board[n - 1][i] ^= 1;
          board[n - 1][i + 1] ^= 1;
          push(n, i + 1, n - 1, i, n - 1, i + 1);
        }
      --n;
    }
    for (int i = 1; i <= n; i += 2)
      for (int j = 1; j <= m; j += 2) solve(i, j);
    printf("%d\n", tot);
    for (int i = 1; i <= tot; ++i)
      printf("%d %d %d %d %d %d\n", x[0][i], y[0][i], x[1][i], y[1][i], x[2][i],
             y[2][i]);
  }
  return 0;
}
