#include <bits/stdc++.h>
using namespace std;
int T, N, M;
char S[105][105];
tuple<int, int, int, int, int, int> makeMove(int i, int j, char type) {
  int i1, j1, i2, j2, i3, j3;
  if (type == 'a') {
    i1 = i, j1 = j + 1;
    i2 = i + 1, j2 = j;
    i3 = i + 1, j3 = j + 1;
  }
  if (type == 'b') {
    i1 = i, j1 = j;
    i2 = i + 1, j2 = j;
    i3 = i + 1, j3 = j + 1;
  }
  if (type == 'c') {
    i1 = i, j1 = j;
    i2 = i, j2 = j + 1;
    i3 = i + 1, j3 = j + 1;
  }
  if (type == 'd') {
    i1 = i, j1 = j;
    i2 = i, j2 = j + 1;
    i3 = i + 1, j3 = j;
  }
  S[i1][j1] = S[i1][j1] == '1' ? '0' : '1';
  S[i2][j2] = S[i2][j2] == '1' ? '0' : '1';
  S[i3][j3] = S[i3][j3] == '1' ? '0' : '1';
  return make_tuple(i1, j1, i2, j2, i3, j3);
}
vector<tuple<int, int, int, int, int, int> > makeMovesRow(int i, int j) {
  vector<tuple<int, int, int, int, int, int> > moves;
  int c = 2 * (S[i][j] - '0') + (S[i][j + 1] - '0');
  if (c == 1) {
    moves.push_back(makeMove(i, j, 'a'));
  } else if (c == 2) {
    moves.push_back(makeMove(i, j, 'b'));
  } else if (c == 3) {
    moves.push_back(makeMove(i, j, 'c'));
  }
  return moves;
}
vector<tuple<int, int, int, int, int, int> > makeMovesCol(int i, int j) {
  vector<tuple<int, int, int, int, int, int> > moves;
  int c = 2 * (S[i][j] - '0') + (S[i + 1][j] - '0');
  if (c == 1) {
    moves.push_back(makeMove(i, j, 'a'));
  } else if (c == 2) {
    moves.push_back(makeMove(i, j, 'c'));
  } else if (c == 3) {
    moves.push_back(makeMove(i, j, 'b'));
  }
  return moves;
}
int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d %d", &N, &M);
    for (int i = 1; i <= N; i++) scanf("%s", S[i] + 1);
    vector<tuple<int, int, int, int, int, int> > moves;
    for (int i = 1; i <= N - 2; i++) {
      for (int j = 1; j <= M; j += 2) {
        for (tuple<int, int, int, int, int, int> m : makeMovesRow(i, j))
          moves.push_back(m);
      }
      if (M % 2) {
        for (tuple<int, int, int, int, int, int> m : makeMovesRow(i, M - 1))
          moves.push_back(m);
      }
    }
    for (int j = 1; j <= M - 2; j++) {
      for (tuple<int, int, int, int, int, int> m : makeMovesCol(N - 1, j))
        moves.push_back(m);
    }
    int c = 8 * (S[N - 1][M - 1] - '0') + 4 * (S[N - 1][M] - '0') +
            2 * (S[N][M - 1] - '0') + 1 * (S[N][M] - '0');
    switch (c) {
      case 1:
        moves.push_back(makeMove(N - 1, M - 1, 'a'));
        moves.push_back(makeMove(N - 1, M - 1, 'b'));
        moves.push_back(makeMove(N - 1, M - 1, 'c'));
        break;
      case 2:
        moves.push_back(makeMove(N - 1, M - 1, 'a'));
        moves.push_back(makeMove(N - 1, M - 1, 'b'));
        moves.push_back(makeMove(N - 1, M - 1, 'd'));
        break;
      case 3:
        moves.push_back(makeMove(N - 1, M - 1, 'c'));
        moves.push_back(makeMove(N - 1, M - 1, 'd'));
        break;
      case 4:
        moves.push_back(makeMove(N - 1, M - 1, 'a'));
        moves.push_back(makeMove(N - 1, M - 1, 'c'));
        moves.push_back(makeMove(N - 1, M - 1, 'd'));
        break;
      case 5:
        moves.push_back(makeMove(N - 1, M - 1, 'b'));
        moves.push_back(makeMove(N - 1, M - 1, 'd'));
        break;
      case 6:
        moves.push_back(makeMove(N - 1, M - 1, 'b'));
        moves.push_back(makeMove(N - 1, M - 1, 'c'));
        break;
      case 7:
        moves.push_back(makeMove(N - 1, M - 1, 'a'));
        break;
      case 8:
        moves.push_back(makeMove(N - 1, M - 1, 'b'));
        moves.push_back(makeMove(N - 1, M - 1, 'c'));
        moves.push_back(makeMove(N - 1, M - 1, 'd'));
        break;
      case 9:
        moves.push_back(makeMove(N - 1, M - 1, 'a'));
        moves.push_back(makeMove(N - 1, M - 1, 'd'));
        break;
      case 10:
        moves.push_back(makeMove(N - 1, M - 1, 'a'));
        moves.push_back(makeMove(N - 1, M - 1, 'c'));
        break;
      case 11:
        moves.push_back(makeMove(N - 1, M - 1, 'b'));
        break;
      case 12:
        moves.push_back(makeMove(N - 1, M - 1, 'a'));
        moves.push_back(makeMove(N - 1, M - 1, 'b'));
        break;
      case 13:
        moves.push_back(makeMove(N - 1, M - 1, 'c'));
        break;
      case 14:
        moves.push_back(makeMove(N - 1, M - 1, 'd'));
        break;
      case 15:
        moves.push_back(makeMove(N - 1, M - 1, 'a'));
        moves.push_back(makeMove(N - 1, M - 1, 'b'));
        moves.push_back(makeMove(N - 1, M - 1, 'c'));
        moves.push_back(makeMove(N - 1, M - 1, 'd'));
        break;
    }
    printf("%d\n", (int)moves.size());
    for (tuple<int, int, int, int, int, int> m : moves) {
      int i1, j1, i2, j2, i3, j3;
      tie(i1, j1, i2, j2, i3, j3) = m;
      printf("%d %d %d %d %d %d\n", i1, j1, i2, j2, i3, j3);
    }
  }
}
