#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
void pBoard(const vector<string> &board) {
  for (auto s : board) {
    cout << s << "\n";
  }
}
vector<string> board;
void insertMove(vector<int> &coords, int rh, int ry, int lh, int ly) {
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      if (i == lh && j == ly) {
        continue;
      }
      if (board[rh + i][ry + j] == '1') {
        board[rh + i][ry + j] = '0';
      } else if (board[rh + i][ry + j] == '0') {
        board[rh + i][ry + j] = '1';
      }
      coords.push_back(rh + i);
      coords.push_back(ry + j);
    }
  }
}
int count1(string s) {
  int ans = 0;
  for (auto ch : s) {
    if (ch == '1') {
      ans++;
    }
  }
  return ans;
}
void solve() {
  int n, m;
  cin >> n >> m;
  board.clear();
  board.resize(n);
  vector<int> coords;
  for (int i = 0; i < n; i++) {
    cin >> board[i];
  }
  for (int i = 0; i < n - 2; i++) {
    for (int j = 0; j < m - 2; j++) {
      if (board[i][j] == '1') {
        insertMove(coords, i, j, 1, 1);
      }
    }
  }
  for (int i = 0; i < n - 2; i++) {
    if (board[i][m - 1] == '1' && board[i][m - 2] == '1') {
      insertMove(coords, i, m - 2, 1, 0);
    } else if (board[i][m - 1] == '1' && board[i][m - 2] == '0') {
      insertMove(coords, i, m - 2, 0, 0);
    } else if (board[i][m - 1] == '0' && board[i][m - 2] == '1') {
      insertMove(coords, i, m - 2, 0, 1);
    }
  }
  for (int j = 0; j < m - 2; j++) {
    if (board[n - 2][j] == '1' && board[n - 1][j] == '1') {
      insertMove(coords, n - 2, j, 0, 1);
    }
    if (board[n - 2][j] == '1' && board[n - 1][j] == '0') {
      insertMove(coords, n - 2, j, 1, 0);
    }
    if (board[n - 2][j] == '0' && board[n - 1][j] == '1') {
      insertMove(coords, n - 2, j, 0, 0);
    }
  }
  string lastCase = string(1, board[n - 2][m - 2]) + board[n - 2][m - 1] +
                    board[n - 1][m - 2] + board[n - 1][m - 1];
  if (lastCase == "0001") {
    insertMove(coords, n - 2, m - 2, 1, 0);
    insertMove(coords, n - 2, m - 2, 0, 0);
    insertMove(coords, n - 2, m - 2, 0, 1);
  }
  if (lastCase == "0010") {
    insertMove(coords, n - 2, m - 2, 1, 1);
    insertMove(coords, n - 2, m - 2, 0, 0);
    insertMove(coords, n - 2, m - 2, 0, 1);
  }
  if (lastCase == "0011") {
    insertMove(coords, n - 2, m - 2, 1, 1);
    insertMove(coords, n - 2, m - 2, 1, 0);
  }
  if (lastCase == "0100") {
    insertMove(coords, n - 2, m - 2, 0, 0);
    insertMove(coords, n - 2, m - 2, 1, 0);
    insertMove(coords, n - 2, m - 2, 1, 1);
  }
  if (lastCase == "0101") {
    insertMove(coords, n - 2, m - 2, 1, 1);
    insertMove(coords, n - 2, m - 2, 0, 1);
  }
  if (lastCase == "0110") {
    insertMove(coords, n - 2, m - 2, 0, 1);
    insertMove(coords, n - 2, m - 2, 1, 0);
  }
  if (lastCase == "0111") {
    insertMove(coords, n - 2, m - 2, 0, 0);
  }
  if (lastCase == "1000") {
    insertMove(coords, n - 2, m - 2, 0, 1);
    insertMove(coords, n - 2, m - 2, 1, 1);
    insertMove(coords, n - 2, m - 2, 1, 0);
  }
  if (lastCase == "1001") {
    insertMove(coords, n - 2, m - 2, 1, 1);
    insertMove(coords, n - 2, m - 2, 0, 0);
  }
  if (lastCase == "1010") {
    insertMove(coords, n - 2, m - 2, 1, 0);
    insertMove(coords, n - 2, m - 2, 0, 0);
  }
  if (lastCase == "1011") {
    insertMove(coords, n - 2, m - 2, 0, 1);
  }
  if (lastCase == "1100") {
    insertMove(coords, n - 2, m - 2, 0, 0);
    insertMove(coords, n - 2, m - 2, 0, 1);
  }
  if (lastCase == "1101") {
    insertMove(coords, n - 2, m - 2, 1, 0);
  }
  if (lastCase == "1110") {
    insertMove(coords, n - 2, m - 2, 1, 1);
  }
  if (lastCase == "1111") {
    insertMove(coords, n - 2, m - 2, 0, 0);
    insertMove(coords, n - 2, m - 2, 0, 1);
    insertMove(coords, n - 2, m - 2, 1, 1);
    insertMove(coords, n - 2, m - 2, 1, 0);
  }
  cout << coords.size() / 6 << "\n";
  int count = 0;
  for (auto v : coords) {
    cout << v + 1 << " ";
    count++;
    if (count % 6 == 0) {
      cout << "\n";
    }
  }
}
int main() {
  int t;
  cin >> t;
  while (t--) solve();
  return 0;
}
