#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class A, class B>
ostream& operator<<(ostream& os, const pair<A, B>& p) {
  return os << '(' << p.first << ", " << p.second << ')';
}
template <class T>
auto operator<<(ostream& os, T&& x) -> decltype(x.begin(), os) {
  os << '{';
  for (auto it = x.begin(); it != x.end(); ++it)
    os << *it << (it == prev(x.end()) ? "" : ", ");
  return os << '}';
}
void dump() {}
template <class T, class... Args>
void dump(T&& x, Args... args) {
  cerr << x << ";  ";
  dump(args...);
}
int t, n, m;
vector<string> table;
vector<vector<int>> ans;
void apply() {
  for (int i = 0; i < 3; ++i) {
    char& curr = table[ans.back()[2 * i]][ans.back()[2 * i + 1]];
    if (curr == '1')
      curr = '0';
    else
      curr = '1';
  }
}
void solve() {
  cin >> n >> m;
  table.resize(n);
  ans.clear();
  for (int i = 0; i < n; ++i) cin >> table[i];
  int row = 0, col = 0;
  while (n - row > 2 || m - col > 2) {
    if (n - row > 2) {
      for (int i = col; i + 1 < m; ++i) {
        if (table[row][i] == '1' && table[row][i + 1] == '1') {
          ans.push_back({row, i, row, i + 1, row + 1, i + 1});
          apply();
        } else if (table[row][i] == '1') {
          ans.push_back({row, i, row + 1, i, row + 1, i + 1});
          apply();
        }
      }
      if (table[row][m - 1] == '1') {
        ans.push_back({row, m - 1, row + 1, m - 2, row + 1, m - 1});
        apply();
      }
      ++row;
    }
    if (m - col > 2) {
      for (int i = row; i + 1 < n; ++i) {
        if (table[i][col] == '1' && table[i + 1][col] == '1') {
          ans.push_back({i, col, i + 1, col, i + 1, col + 1});
          apply();
        } else if (table[i][col] == '1') {
          ans.push_back({i, col, i, col + 1, i + 1, col + 1});
          apply();
        }
      }
      if (table[n - 1][col] == '1') {
        ans.push_back({n - 1, col, n - 2, col + 1, n - 1, col + 1});
        apply();
      }
      ++col;
    }
  }
  vector<pair<int, int>> onepos, zeropos;
  for (int i = row; i < n; ++i)
    for (int j = col; j < m; ++j) {
      if (table[i][j] == '1')
        onepos.push_back({i, j});
      else
        zeropos.push_back({i, j});
    }
  while (onepos.size()) {
    if (onepos.size() == 3) {
      ans.push_back({onepos[0].first, onepos[0].second, onepos[1].first,
                     onepos[1].second, onepos[2].first, onepos[2].second});
      apply();
      onepos.clear();
    }
    if (onepos.size() == 4) {
      ans.push_back({onepos[0].first, onepos[0].second, onepos[1].first,
                     onepos[1].second, onepos[2].first, onepos[2].second});
      apply();
      zeropos = {onepos[0], onepos[1], onepos[2]};
      onepos = {onepos[3]};
    }
    if (onepos.size() == 1 || onepos.size() == 2) {
      ans.push_back({onepos[0].first, onepos[0].second, zeropos[0].first,
                     zeropos[0].second, zeropos[1].first, zeropos[1].second});
      apply();
      onepos.clear(), zeropos.clear();
      for (int i = row; i < n; ++i)
        for (int j = col; j < m; ++j) {
          if (table[i][j] == '1')
            onepos.push_back({i, j});
          else
            zeropos.push_back({i, j});
        }
    }
  }
  cout << ans.size() << endl;
  for (auto& vec : ans) {
    for (int i = 0; i < 6; ++i) cout << vec[i] + 1 << " ";
    cout << endl;
  }
}
int main() {
  ios::sync_with_stdio(false);
  for (cin >> t; t--;) solve();
  return 0;
}
