#include <bits/stdc++.h>
using namespace std;
int dadsadasda;
const int INF = 0x3f3f3f3f;
const long long INFLL = 1e18 + 1;
const int MOD = 998244353;
const int MAXN = 100 + 1;
struct ope {
  int x1, y1, x2, y2, x3, y3;
};
vector<ope> ans;
int n, m, A[MAXN][MAXN];
char B[MAXN][MAXN];
void op(pair<int, int> p1, pair<int, int> p2, pair<int, int> p3) {
  ans.push_back({p1.first + 1, p1.second + 1, p2.first + 1, p2.second + 1,
                 p3.first + 1, p3.second + 1});
  A[p1.first][p1.second] = !A[p1.first][p1.second];
  A[p2.first][p2.second] = !A[p2.first][p2.second];
  A[p3.first][p3.second] = !A[p3.first][p3.second];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int t;
  cin >> t;
  while (t--) {
    cin >> n >> m;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) cin >> B[i][j], A[i][j] = (B[i][j] == '1');
    ans.clear();
    if (n % 2 && m % 2 && A[n - 1][m - 1]) {
      op({n - 1, m - 1}, {n - 1, m - 2}, {n - 2, m - 1});
    }
    if (n % 2) {
      for (int j = 0; j < m; j++)
        if (A[n - 1][j]) {
          if ((j > 0) && (j == m - 2 || j == m - 1)) {
            op({n - 1, j}, {n - 2, j}, {n - 2, j - 1});
          } else {
            op({n - 1, j}, {n - 2, j}, {n - 2, j + 1});
          }
        }
    }
    if (m % 2) {
      for (int i = 0; i < n; i++)
        if (A[i][m - 1]) {
          if ((i > 0) && (i == n - 1 || i == n - 2)) {
            op({i, m - 1}, {i, m - 2}, {i - 1, m - 2});
          } else {
            op({i, m - 1}, {i, m - 2}, {i + 1, m - 2});
          }
        }
    }
    for (int i = 0; i < n - n % 2; i += 2) {
      for (int j = 0; j < m - m % 2; j += 2) {
        vector<pair<int, int> > on;
        pair<int, int> d = {-1, -1};
        for (int i2 = 0; i2 < 2; i2++) {
          for (int j2 = 0; j2 < 2; j2++) {
            if (A[i + i2][j + j2]) {
              on.push_back({i + i2, j + j2});
            } else
              d = {i + i2, j + j2};
          }
        }
        if ((int)on.size() == 4 || (int)on.size() == 3) {
          pair<int, int> p1 = on.back();
          on.pop_back();
          pair<int, int> p2 = on.back();
          on.pop_back();
          pair<int, int> p3 = on.back();
          on.pop_back();
          op(p1, p2, p3);
        }
        if ((int)on.size() == 2) {
          op(d, on[0], on[1]);
          on.pop_back();
          on.pop_back();
          on.push_back(d);
        }
        if ((int)on.size() == 1) {
          pair<int, int> p = on.back();
          if (p.first == i && p.second == j) {
            op({i, j}, {i + 1, j}, {i, j + 1});
            op({i, j}, {i, j + 1}, {i + 1, j + 1});
            op({i, j}, {i + 1, j}, {i + 1, j + 1});
          } else if (p.first == i && p.second == j + 1) {
            op({i, j + 1}, {i + 1, j}, {i, j});
            op({i, j + 1}, {i + 1, j}, {i + 1, j + 1});
            op({i, j + 1}, {i, j}, {i + 1, j + 1});
          } else if (p.first == i + 1 && p.second == j) {
            op({i + 1, j}, {i, j}, {i, j + 1});
            op({i + 1, j}, {i + 1, j + 1}, {i, j + 1});
            op({i + 1, j}, {i, j}, {i + 1, j + 1});
          } else {
            op({i + 1, j + 1}, {i, j}, {i, j + 1});
            op({i + 1, j + 1}, {i, j}, {i + 1, j});
            op({i + 1, j + 1}, {i + 1, j}, {i, j + 1});
          }
        }
      }
    }
    cout << (int)ans.size() << '\n';
    for (auto e : ans) {
      cout << e.x1 << " " << e.y1 << " " << e.x2 << " " << e.y2 << " " << e.x3
           << " " << e.y3 << '\n';
    }
  }
  return 0;
}
