#include <bits/stdc++.h>
using namespace std;
template <typename A, typename B>
string to_string(pair<A, B> p);
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);
string to_string(const string &s) { return '"' + s + '"'; }
string to_string(const char *s) { return to_string((string)s); }
string to_string(bool b) { return (b ? "true" : "false"); }
string to_string(vector<bool> v) {
  bool first = true;
  string res = "[";
  for (int i = 0; i < static_cast<int>(v.size()); i++) {
    if (!first) res += ", ";
    first = false;
    res += to_string(v[i]);
  }
  res += "]";
  return res;
}
template <size_t N>
string to_string(bitset<N> v) {
  string res = "";
  for (size_t i = 0; i < N; i++) res += static_cast<char>('0' + v[i]);
  return res;
}
template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "[";
  for (const auto &x : v) {
    if (!first) res += ", ";
    first = false;
    res += to_string(x);
  }
  res += "]";
  return res;
}
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ")";
}
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
vector<string> vec_splitter(string s) {
  s += ',';
  vector<string> res;
  while (!s.empty()) {
    res.push_back(s.substr(0, s.find(',')));
    s = s.substr(s.find(',') + 1);
  }
  return res;
}
void debug_out(vector<string> __attribute__((unused)) args,
               __attribute__((unused)) int idx,
               __attribute__((unused)) int LINE_NUM) {
  cerr << endl;
}
template <typename Head, typename... Tail>
void debug_out(vector<string> args, int idx, int LINE_NUM, Head H, Tail... T) {
  if (idx > 0)
    cerr << ", ";
  else
    cerr << "Line(" << LINE_NUM << ") ";
  cerr << args[idx] << " = " << to_string(H);
  debug_out(args, idx + 1, LINE_NUM, T...);
}
const long long INF = 1e9 + 5;
const double EPS = 1e-9;
vector<tuple<pair<int, int>, pair<int, int>, pair<int, int>>> res;
int main() {
  long long TC;
  cin >> TC;
  while (TC--) {
    int n, m;
    cin >> n >> m;
    vector<string> vs(n);
    for (auto &i : vs) cin >> i;
    vector<vector<int>> a(n, vector<int>(m, 0));
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) a[i][j] = vs[i][j] - '0';
    res = {};
    auto up = [&](int i, int j) {
      int c = 0;
      vector<pair<int, int>> ones;
      if (a[i - 1][j - 1])
        ones.push_back({i - 1, j - 1}), c++, a[i - 1][j - 1] = 0;
      if (a[i - 1][j]) ones.push_back({i - 1, j}), c++, a[i - 1][j] = 0;
      if (c == 0) return;
      if (c == 1)
        ones.push_back({i, j}), ones.push_back({i, j - 1}), a[i][j] ^= 1,
            a[i][j - 1] ^= 1;
      if (c == 2) ones.push_back({i, j}), a[i][j] ^= 1;
      res.push_back({ones[0], ones[1], ones[2]});
    };
    auto down = [&](int i, int j) {
      int c = 0;
      vector<pair<int, int>> ones;
      if (a[i - 1][j - 1])
        ones.push_back({i - 1, j - 1}), c++, a[i - 1][j - 1] = 0;
      if (a[i][j - 1]) ones.push_back({i, j - 1}), c++, a[i][j - 1] = 0;
      if (c == 0) return;
      if (c == 1)
        ones.push_back({i, j}), ones.push_back({i - 1, j}), a[i][j] ^= 1,
            a[i - 1][j] ^= 1;
      if (c == 2) ones.push_back({i, j}), a[i][j] ^= 1;
      res.push_back({ones[0], ones[1], ones[2]});
    };
    for (int i = 1; i < n; i++) {
      for (int j = 1; j < m; j += 2) up(i, j);
      if (m % 2) up(i, m - 1);
    }
    for (int j = 1; j < m - 1; j++) {
      int i = n - 1;
      down(i, j);
    }
    auto f3 = [&](vector<pair<int, int>> ones, vector<pair<int, int>> zeros) {
      res.push_back({ones[0], ones[1], ones[2]});
    };
    auto f2 = [&](vector<pair<int, int>> ones, vector<pair<int, int>> zeros) {
      res.push_back({zeros[0], zeros[1], ones[0]});
      vector<pair<int, int>> o = {zeros[0], zeros[1], ones[1]};
      vector<pair<int, int>> z = {ones[0]};
      f3(o, z);
    };
    auto f1 = [&](vector<pair<int, int>> ones, vector<pair<int, int>> zeros) {
      res.push_back({ones[0], zeros[0], zeros[1]});
      vector<pair<int, int>> o = {zeros[0], zeros[1]};
      vector<pair<int, int>> z = {zeros[2], ones[0]};
      f2(o, z);
    };
    auto f4 = [&](vector<pair<int, int>> ones, vector<pair<int, int>> zeros) {
      res.push_back({ones[0], ones[1], ones[2]});
      f1({ones[3]}, {ones[0], ones[1], ones[2]});
    };
    auto cnt = [&](int i, int j) {
      int c = 0;
      vector<pair<int, int>> ones, zeros;
      for (int x = i - 1; x <= i; x++)
        for (int y = j - 1; y <= j; y++) {
          if (a[x][y] == 1)
            ones.push_back({x, y}), c++;
          else
            zeros.push_back({x, y});
          a[x][y] = 0;
        }
      if (c == 1)
        f1(ones, zeros);
      else if (c == 2)
        f2(ones, zeros);
      else if (c == 3)
        f3(ones, zeros);
      else if (c == 4)
        f4(ones, zeros);
    };
    cnt(n - 1, m - 1);
    42;
    cout << res.size() << '\n';
    for (auto [a, b, c] : res) {
      cout << a.first + 1 << ' ' << a.second + 1 << ' ';
      cout << b.first + 1 << ' ' << b.second + 1 << ' ';
      cout << c.first + 1 << ' ' << c.second + 1 << ' ';
      cout << '\n';
    }
  }
}
