#include <bits/stdc++.h>
using namespace std;
const long long int mod = 1000000007;
const long long int mod1 = 998244353;
const long long int INF = 1000000000000000000;
const long long int NEGINF = LLONG_MIN;
const int N = 18;
const long long int MAXN = 1000001;
long long int n, m;
string s[5001];
int a[1001][1001];
vector<vector<pair<long long int, long long int> > > ans;
bool foo(long long int x, long long int y) {
  vector<pair<long long int, long long int> > z, o;
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      if (a[x + i][y + j] == 0)
        z.push_back({x + i, y + j});
      else
        o.push_back({x + i, y + j});
    }
  }
  vector<pair<long long int, long long int> > v;
  if (o.size() == 2 or o.size() == 1) {
    for (int i = 0; i < 1; i++) {
      v.push_back(o[i]);
      long long int xx = o[i].first;
      long long int yy = o[i].second;
      a[xx][yy] ^= 1;
    }
    for (int i = 0; i < 2; i++) {
      v.push_back(z[i]);
      long long int xx = z[i].first;
      long long int yy = z[i].second;
      a[xx][yy] ^= 1;
    }
  } else if (o.size() == 3 or o.size() == 4) {
    for (int i = 0; i < 3; i++) {
      v.push_back(o[i]);
      long long int xx = o[i].first;
      long long int yy = o[i].second;
      a[xx][yy] ^= 1;
    }
  }
  if (!v.empty()) ans.push_back(v);
  v.clear();
  z.clear();
  o.clear();
  long long int cn = 0;
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      if (a[x + i][y + j] == 1) cn++;
    }
  }
  if (cn == 0) return true;
  return false;
}
void solve(int t) {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> s[i];
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      a[i][j] = s[i][j] - '0';
    }
  }
  if (n % 2 == 1 and m % 2 == 1) {
    if (a[n - 1][m - 1] == 1) {
      ans.push_back({{n - 1, m - 1}, {n - 2, m - 1}, {n - 1, m - 2}});
      for (auto j : ans.back()) {
        a[j.first][j.second] ^= 1;
      }
    }
  }
  if (m % 2 == 1) {
    if (a[0][m - 1] == 1) {
      ans.push_back({{0, m - 1}, {0, m - 2}, {1, m - 2}});
      for (auto j : ans.back()) {
        a[j.first][j.second] ^= 1;
      }
    }
    for (int i = 1; i < n; i++) {
      if (a[i][m - 1] == 1) {
        ans.push_back({{i, m - 1}, {i, m - 2}, {i - 1, m - 2}});
        for (auto j : ans.back()) {
          a[j.first][j.second] ^= 1;
        }
      }
    }
  }
  if (n % 2 == 1) {
    if (a[n - 1][0] == 1) {
      ans.push_back({{n - 1, 0}, {n - 2, 0}, {n - 2, 1}});
      for (auto j : ans.back()) {
        a[j.first][j.second] ^= 1;
      }
    }
    for (int i = 1; i < m; i++) {
      if (a[n - 1][i] == 1) {
        ans.push_back({{n - 1, i}, {n - 2, i}, {n - 2, i - 1}});
        for (auto j : ans.back()) {
          a[j.first][j.second] ^= 1;
        }
      }
    }
  }
  for (int i = 0; i < n - 1; i += 2) {
    for (int j = 0; j < m - 1; j += 2) {
      while (!foo(i, j))
        ;
    }
  }
  cout << ans.size() << "\n";
  for (auto i : ans) {
    for (auto j : i) {
      cout << j.first + 1 << " " << j.second + 1 << " ";
    }
    if (!i.empty()) cout << "\n";
  }
  ans.clear();
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int t = 1;
  cin >> t;
  for (int i = 1; i <= t; i++) {
    solve(i);
  }
}
