#include <bits/stdc++.h>
template <typename T1, typename T2>
inline bool chkmin(T1& x, const T2& y) {
  if (x > y) {
    x = y;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
inline bool chkmax(T1& x, const T2& y) {
  if (x < y) {
    x = y;
    return 1;
  }
  return 0;
}
using namespace std;
const long long maxn = 2e5 + 20;
ostream& operator<<(ostream& out, vector<long long>& v) {
  for (auto& x : v) out << x << ' ';
  return out;
}
ostream& operator<<(ostream& out, pair<long long, long long>& v) {
  out << v.first << ", " << v.second;
  return out;
}
istream& operator>>(istream& in, pair<long long, long long>& a) {
  in >> a.first >> a.second;
  return in;
}
const long long inf = (long long)2e9;
const long double pi = asin(1) * 2;
const long double eps = 1e-8;
const long long mod = (long long)1e9 + 7;
const long long ns = 97;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
void rev(char& x) {
  if (x == '0')
    x = '1';
  else
    x = '0';
}
void solve() {
  long long n, m;
  cin >> n >> m;
  vector<vector<char>> goo(n, vector<char>(m));
  for (auto& v : goo)
    for (auto& x : v) cin >> x;
  vector<vector<pair<long long, long long>>> ans;
  for (long long i = 0; i < n - 1; ++i) {
    for (long long j = m - 1; j > 0; --j) {
      if (goo[i][j] == '0') continue;
      ans.push_back({{i, j}, {i + 1, j}, {i + 1, j - 1}});
      rev(goo[i][j]);
      rev(goo[i + 1][j]);
      rev(goo[i + 1][j - 1]);
    }
    if (goo[i][0] == '1') {
      ans.push_back({{i, 0}, {i + 1, 0}, {i + 1, 1}});
      rev(goo[i][0]);
      rev(goo[i + 1][0]);
      rev(goo[i + 1][1]);
    }
  }
  long long i = n - 1;
  for (long long j = m - 1; j > 0; --j) {
    if (goo[i][j] == '1' && goo[i - 1][j] == '1') {
      ans.push_back({{i, j}, {i - 1, j}, {i, j - 1}});
      rev(goo[i][j]);
      rev(goo[i - 1][j]);
      rev(goo[i][j - 1]);
    } else if (goo[i][j] == '1') {
      ans.push_back({{i, j}, {i, j - 1}, {i - 1, j - 1}});
      rev(goo[i][j]);
      rev(goo[i][j - 1]);
      rev(goo[i - 1][j - 1]);
    } else if (goo[i - 1][j] == '1') {
      ans.push_back({{i - 1, j}, {i, j - 1}, {i - 1, j - 1}});
      rev(goo[i - 1][j]);
      rev(goo[i][j - 1]);
      rev(goo[i - 1][j - 1]);
    }
  }
  if (goo[i][0] == '1' && goo[i - 1][0] == '1') {
    ans.push_back({{i, 0}, {i, 1}, {i - 1, 1}});
    ans.push_back({{i - 1, 0}, {i - 1, 1}, {i, 1}});
  } else if (goo[i][0] == '1') {
    ans.push_back({{i - 1, 0}, {i, 0}, {i, 1}});
    ans.push_back({{i - 1, 0}, {i, 0}, {i - 1, 1}});
    ans.push_back({{i, 0}, {i, 1}, {i - 1, 1}});
  } else if (goo[i - 1][0] == '1') {
    ans.push_back({{i - 1, 0}, {i, 0}, {i, 1}});
    ans.push_back({{i - 1, 0}, {i - 1, 1}, {i, 0}});
    ans.push_back({{i - 1, 0}, {i - 1, 1}, {i, 1}});
  }
  cout << (long long)ans.size() << '\n';
  for (auto& v : ans) {
    for (auto& x : v) {
      cout << x.first + 1 << ' ' << x.second + 1 << ' ';
    }
    cout << '\n';
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  long long q = 1;
  cin >> q;
  while (q--) solve();
}
