#include <bits/stdc++.h>
using namespace std;
vector<vector<long long>> v(101, vector<long long>(101));
vector<vector<long long>> ans;
vector<long long> assign(int a, int b, int c, int d, int e, int f) {
  vector<long long> res(6);
  v[a][b] ^= 1;
  v[c][d] ^= 1;
  v[e][f] ^= 1;
  res[0] = a;
  res[1] = b;
  res[2] = c;
  res[3] = d;
  res[4] = e;
  res[5] = f;
  return res;
}
void evaluate(long long x, long long y) {
  vector<pair<long long, long long>> o, z;
  for (long long i = x; i <= x + 1; i++) {
    for (long long j = y; j <= y + 1; j++) {
      if (v[i][j] == 1)
        o.push_back(make_pair(i, j));
      else
        z.push_back(make_pair(i, j));
    }
  }
  while (o.size() != 0) {
    if (o.size() <= 2) {
      vector<long long> t;
      auto k = o.back();
      o.pop_back();
      t.push_back(k.first);
      t.push_back(k.second);
      o.push_back(z.back());
      t.push_back(z.back().first);
      t.push_back(z.back().second);
      z.pop_back();
      t.push_back(z.back().first);
      t.push_back(z.back().second);
      o.push_back(z.back());
      z.pop_back();
      z.push_back(k);
      ans.push_back(t);
    } else {
      vector<long long> t;
      for (long long i = 0; i < 3; i++) {
        auto k = o.back();
        z.push_back(k);
        t.push_back(k.first);
        t.push_back(k.second);
        o.pop_back();
      }
      ans.push_back(t);
    }
  }
}
void print(vector<vector<long long>> p) {
  for (auto x : p) {
    for (auto y : x) cout << y << " ";
    cout << '\n';
    ;
  }
  cout << "____________" << '\n';
  ;
}
void solve() {
  long long n, m;
  cin >> n >> m;
  v.assign(n, vector<long long>(m, 0));
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      char c;
      cin >> c;
      v[i][j] = c - 48;
    }
  }
  for (long long i = 0; i < n - 2; i++) {
    for (long long j = 0; j < m - 2; j++) {
      if (v[i][j] == 1) {
        ans.push_back(assign(i, j, i + 1, j, i, j + 1));
      }
    }
  }
  for (long long i = 0; i < m - 2; i++) {
    if (v[n - 1][i] == 1 && v[n - 2][i] == 0) {
      ans.push_back(assign(n - 1, i, n - 1, i + 1, n - 2, i + 1));
    } else if (v[n - 1][i] == 0 && v[n - 2][i] == 1) {
      ans.push_back(assign(n - 2, i, n - 1, i + 1, n - 2, i + 1));
    } else if (v[n - 1][i] == 1 && v[n - 2][i] == 1) {
      ans.push_back(assign(n - 1, i, n - 2, i, n - 2, i + 1));
    }
  }
  for (long long i = 0; i < n - 2; i++) {
    if (v[i][m - 1] == 1 && v[i][m - 2] == 0) {
      ans.push_back(assign(i, m - 1, i + 1, m - 1, i + 1, m - 2));
    } else if (v[i][m - 1] == 0 && v[i][m - 2] == 1) {
      ans.push_back(assign(i, m - 2, i + 1, m - 1, i + 1, m - 2));
    } else if (v[i][m - 1] == 1 && v[i][m - 2] == 1) {
      ans.push_back(assign(i, m - 1, i, m - 2, i + 1, m - 2));
    }
  }
  evaluate(n - 2, m - 2);
  cout << (long long)ans.size() << '\n';
  ;
  for (auto x : ans) {
    for (auto y : x) {
      cout << y + 1 << " ";
    }
    cout << '\n';
    ;
  }
  ans.clear();
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int tc;
  tc = 1;
  cin >> tc;
  for (int i = 1; i <= tc; i++) {
    solve();
  }
  return 0;
}
