#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5003;
int n, m;
char a[MAXN][MAXN];
vector<pair<int, int>> oper;
void solve(int i, int j) {
  if (i == n - 1) i--;
  if (j == m - 1) j--;
  vector<pair<int, int>> ones;
  vector<pair<int, int>> zeros;
  if (a[i][j] == '1')
    ones.emplace_back(i, j);
  else
    zeros.emplace_back(i, j);
  if (a[i + 1][j] == '1')
    ones.emplace_back(i + 1, j);
  else
    zeros.emplace_back(i + 1, j);
  if (a[i][j + 1] == '1')
    ones.emplace_back(i, j + 1);
  else
    zeros.emplace_back(i, j + 1);
  if (a[i + 1][j + 1] == '1')
    ones.emplace_back(i + 1, j + 1);
  else
    zeros.emplace_back(i + 1, j + 1);
  if (ones.size() == 0) return;
  if (ones.size() == 3) {
    for (auto p : ones) {
      a[p.first][p.second] = '0';
      oper.emplace_back(p.first, p.second);
    }
    return;
  }
  if (ones.size() == 2) {
    for (auto p : zeros) {
      a[p.first][p.second] = '1';
      oper.emplace_back(p.first, p.second);
    }
    a[ones.front().first][ones.front().second] = '0';
    oper.emplace_back(ones.front().first, ones.front().second);
    solve(i, j);
    return;
  }
  if (ones.size() == 1) {
    for (auto p : ones) {
      a[p.first][p.second] = '0';
      oper.emplace_back(p.first, p.second);
    }
    int stop = 0;
    for (auto p : zeros) {
      if (++stop == 3) break;
      a[p.first][p.second] = '1';
      oper.emplace_back(p.first, p.second);
    }
    solve(i, j);
    return;
  }
  if (ones.size() == 4) {
    int stop = 0;
    for (auto p : ones) {
      if (++stop == 4) break;
      a[p.first][p.second] = '0';
      oper.emplace_back(p.first, p.second);
    }
    solve(i, j);
    return;
  }
}
int main() {
  ios ::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int t;
  cin >> t;
  while (t--) {
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < m; ++j) {
        cin >> a[i][j];
      }
    }
    if (n % 2 == 1 and m % 2 == 1 and a[n - 1][m - 1] == '1') {
      a[n - 1][m - 1] = '0';
      a[n - 2][m - 1] = (a[n - 2][m - 1] == '0') ? '1' : '0';
      a[n - 1][m - 2] = (a[n - 1][m - 2] == '0') ? '1' : '0';
      oper.emplace_back(n - 1, m - 1);
      oper.emplace_back(n - 2, m - 1);
      oper.emplace_back(n - 1, m - 2);
    }
    if (n % 2 == 1) {
      for (int j = 0; j < m; j += 2) {
        if (j == m - 1) break;
        if (a[n - 1][j] == '0' and a[n - 1][j + 1] == '0') continue;
        if (a[n - 1][j] == '1' and a[n - 1][j + 1] == '1') {
          a[n - 1][j] = a[n - 1][j + 1] = '0';
          a[n - 2][j] = (a[n - 2][j] == '0') ? '1' : '0';
          oper.emplace_back(n - 1, j);
          oper.emplace_back(n - 1, j + 1);
          oper.emplace_back(n - 2, j);
          continue;
        }
        if (a[n - 1][j] == '1') {
          a[n - 1][j] = '0';
          a[n - 2][j] = (a[n - 2][j] == '0') ? '1' : '0';
          a[n - 2][j + 1] = (a[n - 2][j + 1] == '0') ? '1' : '0';
          oper.emplace_back(n - 1, j);
          oper.emplace_back(n - 2, j + 1);
          oper.emplace_back(n - 2, j);
          continue;
        }
        if (a[n - 1][j + 1] == '1') {
          a[n - 1][j + 1] = '0';
          a[n - 2][j] = (a[n - 2][j] == '0') ? '1' : '0';
          a[n - 2][j + 1] = (a[n - 2][j + 1] == '0') ? '1' : '0';
          oper.emplace_back(n - 1, j + 1);
          oper.emplace_back(n - 2, j + 1);
          oper.emplace_back(n - 2, j);
          continue;
        }
      }
    }
    if (m % 2 == 1) {
      for (int i = 0; i < n; i += 2) {
        if (i == n - 1) break;
        if (a[i][m - 1] == '0' and a[i + 1][m - 1] == '0') continue;
        if (a[i][m - 1] == '1' and a[i + 1][m - 1] == '1') {
          a[i][m - 1] = a[i + 1][m - 1] = '0';
          a[i][m - 2] = (a[i][m - 2] == '0') ? '1' : '0';
          oper.emplace_back(i, m - 1);
          oper.emplace_back(i + 1, m - 1);
          oper.emplace_back(i, m - 2);
          continue;
        }
        if (a[i][m - 1] == '1') {
          a[i][m - 1] = '0';
          a[i][m - 2] = (a[i][m - 2] == '0') ? '1' : '0';
          a[i + 1][m - 2] = (a[i + 1][m - 2] == '0') ? '1' : '0';
          oper.emplace_back(i, m - 1);
          oper.emplace_back(i, m - 2);
          oper.emplace_back(i + 1, m - 2);
          continue;
        }
        if (a[i + 1][m - 1] == '1') {
          a[i + 1][m - 1] = '0';
          a[i][m - 2] = (a[i][m - 2] == '0') ? '1' : '0';
          a[i + 1][m - 2] = (a[i + 1][m - 2] == '0') ? '1' : '0';
          oper.emplace_back(i + 1, m - 1);
          oper.emplace_back(i, m - 2);
          oper.emplace_back(i + 1, m - 2);
          continue;
        }
      }
    }
    for (int i = 0; i < n; i += 2) {
      for (int j = 0; j < m; j += 2) {
        solve(i, j);
      }
    }
    cout << oper.size() / 3 << endl;
    for (int i = 0; i < oper.size(); i += 3) {
      cout << oper[i].first + 1 << ' ' << oper[i].second + 1 << ' '
           << oper[i + 1].first + 1 << ' ' << oper[i + 1].second + 1 << ' '
           << oper[i + 2].first + 1 << ' ' << oper[i + 2].second + 1 << endl;
    }
    oper.clear();
  }
  return 0;
}
