#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vll = vector<ll>;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
template <class T>
using vv = vector<vector<T>>;
template <class T>
inline bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
const int INF = 1002003004;
const ll LINF = 1002003004005006007ll;
struct preprocess {
  preprocess() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  }
} ____;
void change(vi &op, vector<string> &s) {
  for (int i = 0; i < (int)(3); i++) {
    int x = op[2 * i], y = op[2 * i + 1];
    if (s[x][y] == '0') {
      s[x][y] = '1';
    } else {
      s[x][y] = '0';
    }
  }
}
int main() {
  int _t;
  cin >> _t;
  while (_t--) {
    int n, m;
    cin >> n >> m;
    vector<string> s(n);
    for (int i = 0; i < (int)(n); i++) cin >> s[i];
    vv<int> ans;
    if (n % 2) {
      for (int i = 0; i < (int)(m - 1); i++) {
        if (s[n - 1][i] == '1') {
          vi now = {n - 1, i, n - 2, i, n - 2, i + 1};
          ans.emplace_back(now);
          change(now, s);
        }
      }
    }
    if (m % 2) {
      for (int i = 0; i < (int)(n - 1); i++) {
        if (s[i][m - 1] == '1') {
          vi now = {i, m - 1, i, m - 2, i + 1, m - 2};
          ans.emplace_back(now);
          change(now, s);
        }
      }
    }
    for (int i = 0; i < (int)(n / 2); i++)
      for (int j = 0; j < (int)(m / 2); j++) {
        int x = i * 2, y = j * 2;
        while (1) {
          int cnt = 0;
          pi zero, one;
          vi now;
          for (int i2 = 0; i2 < (int)(2); i2++)
            for (int j2 = 0; j2 < (int)(2); j2++) {
              if (s[x + i2][y + j2] == '1') {
                cnt++;
                one = pi{i2, j2};
              } else {
                zero = pi{i2, j2};
              }
            }
          if (cnt == 0) {
            break;
          }
          if (cnt == 1 || cnt == 3) {
            for (int i2 = 0; i2 < (int)(2); i2++)
              for (int j2 = 0; j2 < (int)(2); j2++) {
                if (i2 == zero.first && j2 == zero.second) continue;
                now.emplace_back(x + i2);
                now.emplace_back(y + j2);
              }
          }
          if (cnt == 2 || cnt == 4) {
            for (int i2 = 0; i2 < (int)(2); i2++)
              for (int j2 = 0; j2 < (int)(2); j2++) {
                if (i2 == one.first && j2 == one.second) continue;
                now.emplace_back(x + i2);
                now.emplace_back(y + j2);
              }
          }
          change(now, s);
          ans.emplace_back(now);
        }
      }
    int x = n - 2, y = m - 2;
    while (1) {
      int cnt = 0;
      pi zero, one;
      vi now;
      for (int i2 = 0; i2 < (int)(2); i2++)
        for (int j2 = 0; j2 < (int)(2); j2++) {
          if (s[x + i2][y + j2] == '1') {
            cnt++;
            one = pi{i2, j2};
          } else {
            zero = pi{i2, j2};
          }
        }
      if (cnt == 0) {
        break;
      }
      if (cnt == 1 || cnt == 3) {
        for (int i2 = 0; i2 < (int)(2); i2++)
          for (int j2 = 0; j2 < (int)(2); j2++) {
            if (i2 == zero.first && j2 == zero.second) continue;
            now.emplace_back(x + i2);
            now.emplace_back(y + j2);
          }
      }
      if (cnt == 2) {
        for (int i2 = 0; i2 < (int)(2); i2++)
          for (int j2 = 0; j2 < (int)(2); j2++) {
            if (i2 == one.first && j2 == one.second) continue;
            now.emplace_back(x + i2);
            now.emplace_back(y + j2);
          }
      }
      change(now, s);
      ans.emplace_back(now);
    }
    cout << ans.size() << '\n';
    for (int i = 0; i < (int)(ans.size()); i++) {
      for (int j = 0; j < (int)(6); j++) {
        cout << ans[i][j] + 1 << ' ';
      }
      cout << '\n';
    }
  }
}
