#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
void change(int x1, int y1, int x2, int y2, int x3, int y3,
            vector<vector<int> > &res, vector<string> &arr) {
  res.push_back({x1, y1, x2, y2, x3, y3});
  arr[x1][y1] = '0' + (1 - (arr[x1][y1] - '0'));
  arr[x2][y2] = '0' + (1 - (arr[x2][y2] - '0'));
  arr[x3][y3] = '0' + (1 - (arr[x3][y3] - '0'));
}
void solve() {
  int n, m;
  cin >> n >> m;
  vector<vector<int> > res;
  vector<string> arr(n);
  for (int i = 0; i < n; ++i) cin >> arr[i];
  for (int i = 0; i < n - 2; ++i)
    for (int j = 0; j < m; ++j)
      if (arr[i][j] == '1') {
        if (j < m - 1) {
          if (arr[i][j + 1] == '1')
            change(i, j, i, j + 1, i + 1, j, res, arr);
          else
            change(i, j, i + 1, j, i + 1, j + 1, res, arr);
        } else if (j == m - 1) {
          change(i, j, i + 1, j - 1, i + 1, j, res, arr);
        }
      }
  for (int j = 0; j < m - 2; ++j) {
    if (arr[n - 2][j] == '1' || arr[n - 1][j] == '1') {
      if (arr[n - 2][j] == '1' && arr[n - 1][j] == '1')
        change(n - 2, j, n - 1, j, n - 2, j + 1, res, arr);
      else if (arr[n - 2][j] == '1')
        change(n - 2, j, n - 1, j + 1, n - 2, j + 1, res, arr);
      else if (arr[n - 1][j] == '1')
        change(n - 1, j, n - 1, j + 1, n - 2, j + 1, res, arr);
    }
  }
  vector<int> to = {0, 2, 3, 0, 1};
  while (true) {
    int cnt = (arr[n - 2][m - 2] - '0') + (arr[n - 1][m - 2] - '0') +
              (arr[n - 2][m - 1] - '0') + (arr[n - 1][m - 1] - '0');
    if (cnt == 0) break;
    int need = to[cnt];
    vector<pair<int, int> > ps = {
        {n - 2, m - 2}, {n - 1, m - 2}, {n - 2, m - 1}, {n - 1, m - 1}};
    bool ok = false;
    for (int a = 0; a < 4 && !ok; ++a)
      for (int b = a + 1; b < 4 && !ok; ++b)
        for (int c = b + 1; c < 4 && !ok; ++c)
          for (int d = 0; d < 4 && !ok; ++d)
            if (d != a && d != b && d != c) {
              int cur = 1 - (arr[ps[a].first][ps[a].second] - '0') + 1 -
                        (arr[ps[b].first][ps[b].second] - '0') + 1 -
                        (arr[ps[c].first][ps[c].second] - '0') +
                        (arr[ps[d].first][ps[d].second] - '0');
              if (cur == need) {
                ok = true;
                change(ps[a].first, ps[a].second, ps[b].first, ps[b].second,
                       ps[c].first, ps[c].second, res, arr);
              }
            }
  }
  if (res.size() > n * m) throw(0);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
      if (arr[i][j] != '0') throw(0);
  cout << res.size() << endl;
  for (int i = 0; i < res.size(); ++i) {
    for (int j = 0; j < 6; ++j) cout << res[i][j] + 1 << " ";
    cout << endl;
  }
}
int main() {
  int tc;
  cin >> tc;
  for (int t = 0; t < tc; ++t) solve();
  return 0;
}
