#include <bits/stdc++.h>
using namespace std;
const long long N = 1000005, mod = 1000000007, M = 1005;
const long long inf = 1000000000000000000;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
long long n, m, k, i, j, matrix[M][M];
vector<tuple<pair<long long, long long>, pair<long long, long long>,
             pair<long long, long long>>>
    ans;
void ansAdd(long long x1, long long y1, long long x2, long long y2,
            long long x3, long long y3) {
  ans.push_back({{x1 + 1, y1 + 1}, {x2 + 1, y2 + 1}, {x3 + 1, y3 + 1}});
  matrix[x1][y1] = 1 - matrix[x1][y1];
  matrix[x2][y2] = 1 - matrix[x2][y2];
  matrix[x3][y3] = 1 - matrix[x3][y3];
}
void solve() {
  cin >> n >> m;
  ans.clear();
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      char ch;
      cin >> ch;
      matrix[i][j] = (ch == '1');
    }
  }
  for (int i = 0; i < n - 2; ++i) {
    for (int j = 0; j < m - 1; ++j) {
      if (matrix[i][j] == 1) {
        long long x, y;
        if (matrix[i][j + 1] == 1)
          x = i, y = j + 1;
        else
          x = i + 1, y = j + 1;
        ansAdd(i, j, i + 1, j, x, y);
      } else if (matrix[i][j + 1] == 1) {
        ansAdd(i + 1, j, i + 1, j + 1, i, j + 1);
      }
    }
  }
  for (int j = 0; j < m - 2; ++j) {
    long long x = n - 2, y = j + 1, x2 = n - 1, y2 = j + 1;
    if (matrix[n - 2][j] == 1) {
      if (matrix[n - 1][j] == 1) {
        ansAdd(n - 2, j, n - 1, j, x, y);
        continue;
      }
      ansAdd(n - 2, j, x, y, x2, y2);
      continue;
    }
    if (matrix[n - 1][j] == 1) {
      ansAdd(n - 1, j, x, y, x2, y2);
    }
    continue;
  }
  long long sum = 0;
  vector<pair<long long, long long>> zeros, ones;
  for (int i = n - 2; i < n; ++i) {
    for (int j = m - 2; j < m; ++j) {
      sum += matrix[i][j];
      if (matrix[i][j] == 0)
        zeros.emplace_back(i, j);
      else
        ones.emplace_back(i, j);
    }
  }
  if (sum == 1) {
    ansAdd(ones[0].first, ones[0].second, zeros[0].first, zeros[0].second,
           zeros[1].first, zeros[1].second);
    ansAdd(zeros[2].first, zeros[2].second, ones[0].first, ones[0].second,
           zeros[0].first, zeros[0].second);
    ansAdd(zeros[2].first, zeros[2].second, ones[0].first, ones[0].second,
           zeros[1].first, zeros[1].second);
  } else if (sum == 2) {
    ansAdd(zeros[1].first, zeros[1].second, ones[0].first, ones[0].second,
           zeros[0].first, zeros[0].second);
    ansAdd(zeros[1].first, zeros[1].second, ones[1].first, ones[1].second,
           zeros[0].first, zeros[0].second);
  } else if (sum == 3) {
    ansAdd(ones[1].first, ones[1].second, ones[2].first, ones[2].second,
           ones[0].first, ones[0].second);
  } else if (sum == 4) {
    ansAdd(n - 2, m - 2, n - 1, m - 2, n - 1, m - 1);
    ones.resize(1);
    ones[0] = {n - 2, m - 1};
    zeros = {{n - 2, m - 2}, {n - 1, m - 2}, {n - 1, m - 1}};
    ansAdd(ones[0].first, ones[0].second, zeros[0].first, zeros[0].second,
           zeros[1].first, zeros[1].second);
    ansAdd(zeros[2].first, zeros[2].second, ones[0].first, ones[0].second,
           zeros[0].first, zeros[0].second);
    ansAdd(zeros[2].first, zeros[2].second, ones[0].first, ones[0].second,
           zeros[1].first, zeros[1].second);
  }
  cout << ans.size() << '\n';
  for (auto t : ans) {
    auto& x = get<0>(t);
    auto& y = get<1>(t);
    auto& z = get<2>(t);
    cout << x.first << " " << x.second << " " << y.first << " " << y.second
         << " " << z.first << " " << z.second << '\n';
  }
}
int main(int argc, char* argv[]) {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int tests = 1;
  cin >> tests;
  while (tests--) {
    solve();
  }
}
