#include <bits/stdc++.h>
using namespace std;
template <class c>
struct rge {
  c b, e;
};
template <class c>
rge<c> range(c i, c j) {
  return rge<c>{i, j};
}
template <class c>
auto dud(c* x) -> decltype(cerr << *x, 0);
template <class c>
char dud(...);
struct debug {
  template <class c>
  debug& operator<<(const c&) {
    return *this;
  }
};
const int nax = 1e9 + 7;
const int mod = 1e9 + 7;
const int inf = 1e9 + 7;
const long long infll = 1e18 + 7;
const long double PI = 3.1415926535897932384626433832795;
struct int6 {
  int a, b, c, d, e, f;
  void print() const {
    cout << a + 1 << ' ' << b + 1 << ' ' << c + 1 << ' ' << d + 1 << ' '
         << e + 1 << ' ' << f + 1 << '\n';
  }
};
void make_zero(vector<string>& s, int x, int y, vector<int6>& ans) {
  auto check = [&](int a, int b, int c, int d) {
    a += '0', b += '0', c += '0', d += '0';
    return s[x][y] == a && s[x][y + 1] == b && s[x + 1][y] == c &&
           s[x + 1][y + 1] == d;
  };
  auto change = [&](int x1, int y1, int x2, int y2, int x3, int y3) {
    s[x1][y1] ^= 1;
    s[x2][y2] ^= 1;
    s[x3][y3] ^= 1;
    ans.push_back(int6{x1, y1, x2, y2, x3, y3});
  };
  if (check(0, 0, 0, 0)) {
    return;
  }
  if (check(1, 0, 0, 0)) {
    change(x, y, x + 1, y, x + 1, y + 1);
    change(x, y, x, y + 1, x + 1, y);
    change(x, y, x, y + 1, x + 1, y + 1);
    return;
  }
  if (check(0, 1, 0, 0)) {
    change(x, y + 1, x + 1, y, x + 1, y + 1);
    change(x, y, x, y + 1, x + 1, y);
    change(x, y, x, y + 1, x + 1, y + 1);
    return;
  }
  if (check(0, 0, 1, 0)) {
    change(x, y, x, y + 1, x + 1, y);
    change(x, y, x + 1, y, x + 1, y + 1);
    change(x, y + 1, x + 1, y, x + 1, y + 1);
    return;
  }
  if (check(0, 0, 0, 1)) {
    change(x, y, x, y + 1, x + 1, y + 1);
    change(x, y, x + 1, y, x + 1, y + 1);
    change(x, y + 1, x + 1, y, x + 1, y + 1);
    return;
  }
  if (check(1, 1, 0, 0)) {
    change(x, y, x + 1, y, x + 1, y + 1);
    change(x, y + 1, x + 1, y, x + 1, y + 1);
    return;
  }
  if (check(1, 0, 1, 0)) {
    change(x, y, x, y + 1, x + 1, y + 1);
    change(x, y + 1, x + 1, y, x + 1, y + 1);
    return;
  }
  if (check(1, 0, 0, 1)) {
    change(x, y, x, y + 1, x + 1, y);
    change(x, y + 1, x + 1, y, x + 1, y + 1);
    return;
  }
  if (check(0, 1, 1, 0)) {
    change(x, y, x, y + 1, x + 1, y + 1);
    change(x, y, x + 1, y, x + 1, y + 1);
    return;
  }
  if (check(0, 1, 0, 1)) {
    change(x, y, x, y + 1, x + 1, y);
    change(x, y, x + 1, y, x + 1, y + 1);
    return;
  }
  if (check(0, 0, 1, 1)) {
    change(x, y, x, y + 1, x + 1, y);
    change(x, y, x, y + 1, x + 1, y + 1);
    return;
  }
  if (check(1, 1, 1, 0)) {
    change(x, y, x, y + 1, x + 1, y);
    return;
  }
  if (check(1, 1, 0, 1)) {
    change(x, y, x, y + 1, x + 1, y + 1);
    return;
  }
  if (check(1, 0, 1, 1)) {
    change(x, y, x + 1, y, x + 1, y + 1);
    return;
  }
  if (check(0, 1, 1, 1)) {
    change(x, y + 1, x + 1, y, x + 1, y + 1);
    return;
  }
  if (check(1, 1, 1, 1)) {
    change(x, y + 1, x + 1, y, x + 1, y + 1);
    change(x, y, x + 1, y, x + 1, y + 1);
    change(x, y, x, y + 1, x + 1, y + 1);
    change(x, y, x, y + 1, x + 1, y);
    return;
  }
}
void solve() {
  static int turn = 1;
  int n, m;
  cin >> n >> m;
  vector<string> s(n);
  for (auto i = 0; i < n; ++i) {
    cin >> s[i];
  }
  vector<int6> ans;
  ans.clear();
  if (m % 2) {
    if (s[0][m - 1] == '1') {
      ans.push_back(int6{0, m - 2, 0, m - 1, 1, m - 2});
      s[0][m - 2] ^= 1;
      s[0][m - 1] ^= 1;
      s[1][m - 2] ^= 1;
    }
    for (auto i = 1; i < n; ++i) {
      if (s[i][m - 1] == '1') {
        ans.push_back(int6{i, m - 1, i, m - 2, i - 1, m - 2});
        s[i][m - 1] ^= 1;
        s[i][m - 2] ^= 1;
        s[i - 1][m - 2] ^= 1;
      }
    }
  }
  if (n % 2) {
    if (s[n - 1][0] == '1') {
      ans.push_back(int6{n - 1, 0, n - 2, 0, n - 2, 1});
      s[n - 1][0] ^= 1;
      s[n - 2][0] ^= 1;
      s[n - 2][1] ^= 1;
    }
    for (auto j = 1; j < m; ++j) {
      if (s[n - 1][j] == '1') {
        ans.push_back(int6{n - 1, j, n - 2, j, n - 2, j - 1});
        s[n - 1][j] ^= 1;
        s[n - 2][j] ^= 1;
        s[n - 2][j - 1] ^= 1;
      }
    }
  }
  for (auto i = 0; i < n - 1; i += 2) {
    for (auto j = 0; j < m - 1; j += 2) {
      make_zero(s, i, j, ans);
    }
  }
  cout << ans.size() << "\n";
  for (const int6& it : ans) {
    it.print();
  }
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int t = 1;
  cin >> t;
  while (t--) {
    solve();
  }
}
