#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int get_random() {
  static uniform_int_distribution<int> dist(0, 1e9 + 6);
  return dist(rng);
}
template <class T>
void make_unique(T& v) {
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
}
int geti() {
  int x;
  cin >> x;
  return x;
}
long long getll() {
  long long x;
  cin >> x;
  return x;
}
double getd() {
  double x;
  cin >> x;
  return x;
}
const int MAXN = 100 + 100;
int n, m;
string s[MAXN];
int a[MAXN][MAXN];
int b[MAXN][MAXN];
vector<array<int, 6>> res;
void op(int i1, int i2, int i3, int i4, int i5, int i6) {
  a[i1][i2] ^= 1;
  a[i3][i4] ^= 1;
  a[i5][i6] ^= 1;
  res.push_back({i1, i2, i3, i4, i5, i6});
}
void cal(int i, int j1, int j2, int j3, int ii) {
  vector<int> js;
  if (a[i][j1]) js.push_back(j1);
  if (a[i][j2]) js.push_back(j2);
  if (a[i][j3]) js.push_back(j3);
  if (js.size() == 0) return;
  if (js.size() == 1) {
    int jj0 = js[0];
    int jj1 = a[i][j1] ? j2 : jj0 - 1;
    op(i, jj1, i, jj0, ii, jj0);
    op(i, jj1, i, jj0, ii, jj1);
    op(i, jj0, ii, jj1, ii, jj0);
  } else if (js.size() == 3) {
    op(i, j1, i, j2, ii, j1);
    op(i, j2, ii, j1, ii, j2);
    op(i, j2, i, j3, ii, j2);
  } else if (a[i][j2]) {
    int jj1 = js[0];
    int jj2 = js[1];
    op(i, jj1, ii, jj1, ii, jj2);
    op(i, jj2, ii, jj1, ii, jj2);
  } else {
    int jj1 = js[0];
    int jj2 = js[1];
    op(i, j1, i, j2, ii, j2);
    op(i, j2, i, j3, ii, j2);
  }
}
void solve(int tt) {
  cin >> n >> m;
  for (auto i = (0); i < (n); i++) cin >> s[i];
  for (auto i = (0); i < (n); i++)
    for (auto j = (0); j < (m); j++) a[i][j] = s[i][j] - '0';
  res.clear();
  for (auto i = (0); i < (n); i++)
    for (auto j = (0); j < (m); j++) {
      b[i][j] = a[i][j];
    }
  if (n == 2 && m == 2) {
    map<int, int> cnt;
    for (auto i = (0); i < (2); i++)
      for (auto j = (0); j < (2); j++) {
        if (b[i][j]) {
          int cur = i * 2 + j;
          for (auto k = (0); k < (4); k++)
            if (k != cur) cnt[k]++;
        }
      }
    for (auto k = (0); k < (4); k++) {
      if (cnt[k] % 2) {
        vector<int> tmp;
        for (auto i = (0); i < (2); i++)
          for (auto j = (0); j < (2); j++) {
            int cur = i * 2 + j;
            if (cur != k) {
              tmp.push_back(i);
              tmp.push_back(j);
            }
          }
        op(tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5]);
      }
    }
  } else {
    int rev = 0;
    if (m == 2) {
      for (auto i = (0); i < (n); i++)
        for (auto j = (0); j < (m); j++) {
          a[j][i] = b[i][j];
        }
      rev = 1;
      swap(n, m);
    } else {
      for (auto i = (0); i < (n); i++)
        for (auto j = (0); j < (m); j++) {
          a[i][j] = b[i][j];
        }
    }
    for (auto j = (0); j < (m - 3); j++)
      for (auto i = (0); i < (n); i++) {
        if (a[i][j]) {
          op(i, j, i, j + 1, (i < n - 1 ? i + 1 : i - 1), j + 1);
        }
      }
    for (auto i = (0); i < (n); i++) {
      cal(i, m - 3, m - 2, m - 1, (i < n - 1 ? i + 1 : i - 1));
    }
    if (rev) {
      for (auto& x : res) {
        swap(x[0], x[1]);
        swap(x[2], x[3]);
        swap(x[4], x[5]);
      }
    }
  }
  cout << res.size() << endl;
  for (auto x : res) {
    for (auto i = (0); i < (6); i++) cout << x[i] + 1 << ' ';
    cout << endl;
  }
  for (auto i = (0); i < (n); i++)
    for (auto j = (0); j < (m); j++) assert(!a[i][j]);
}
int main(int argc, char* argv[]) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int T;
  cin >> T;
  for (int t = 1; t <= T; t++) {
    solve(t);
  };
  return 0;
}
