#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "[";
  for (int i = 0; i < (((int)(v).size())); ++i) {
    if (i) os << ", ";
    os << v[i];
  }
  return os << "]";
}
template <class T, class U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  return os << "(" << p.first << " " << p.second << ")";
}
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using P = pair<int, int>;
using vi = vector<int>;
using vll = vector<ll>;
using vvi = vector<vi>;
using vvll = vector<vll>;
const ll MOD = 1e9 + 7;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;
const ld eps = 1e-9;
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  int t;
  cin >> t;
  while (t--) {
    int n, m;
    cin >> n >> m;
    vector<vector<bool>> g(n, vector<bool>(m));
    for (int i = 0; i < (n); ++i) {
      string s;
      cin >> s;
      for (int j = 0; j < (m); ++j) {
        g[i][j] = s[j] == '1';
      }
    }
    vector<tuple<P, P, P>> ans;
    for (int i = 0; i < (n - 2); ++i) {
      for (int j = 0; j < (m - 2); ++j) {
        if (g[i][j]) {
          ans.push_back({{i, j}, {i + 1, j}, {i, j + 1}});
          g[i][j] = 0;
          g[i + 1][j] = !g[i + 1][j];
          g[i][j + 1] = !g[i][j + 1];
        }
      }
    }
    for (int i = 0; i < (n - 2); ++i) {
      int j = m - 2;
      if (g[i][j] && g[i][j + 1]) {
        ans.push_back({{i, j}, {i, j + 1}, {i + 1, j}});
        g[i][j] = 0;
        g[i][j + 1] = 0;
        g[i + 1][j] = !g[i + 1][j];
      } else if (g[i][j]) {
        ans.push_back({{i, j}, {i + 1, j}, {i + 1, j + 1}});
        g[i][j] = 0;
        g[i + 1][j] = !g[i + 1][j];
        g[i + 1][j + 1] = !g[i + 1][j + 1];
      } else if (g[i][j + 1]) {
        ans.push_back({{i, j + 1}, {i + 1, j}, {i + 1, j + 1}});
        g[i][j + 1] = 0;
        g[i + 1][j] = !g[i + 1][j];
        g[i + 1][j + 1] = !g[i + 1][j + 1];
      }
    }
    for (int j = 0; j < (m - 2); ++j) {
      int i = n - 2;
      if (g[i][j] && g[i + 1][j]) {
        ans.push_back({{i, j}, {i + 1, j}, {i + 1, j + 1}});
        g[i][j] = 0;
        g[i + 1][j] = 0;
        g[i + 1][j + 1] = !g[i + 1][j + 1];
      } else if (g[i][j]) {
        ans.push_back({{i, j}, {i, j + 1}, {i + 1, j + 1}});
        g[i][j] = 0;
        g[i][j + 1] = !g[i][j + 1];
        g[i + 1][j + 1] = !g[i + 1][j + 1];
      } else if (g[i + 1][j]) {
        ans.push_back({{i + 1, j}, {i, j + 1}, {i + 1, j + 1}});
        g[i + 1][j] = 0;
        g[i][j + 1] = !g[i][j + 1];
        g[i + 1][j + 1] = !g[i + 1][j + 1];
      }
    }
    int cnt = 0;
    cnt = g[n - 2][m - 2] + g[n - 1][m - 2] + g[n - 2][m - 1] + g[n - 1][m - 1];
    vector<P> koho;
    for (int i = n - 2; i < n; ++i) {
      for (int j = m - 2; j < m; ++j) {
        if (cnt % 2 == 0 && g[i][j]) {
          koho.emplace_back(i, j);
        } else if (cnt % 2 && !g[i][j]) {
          koho.emplace_back(i, j);
        }
      }
    }
    for (auto &e : koho) {
      vector<P> now;
      for (int i = n - 2; i < n; ++i) {
        for (int j = m - 2; j < m; ++j) {
          if (i != e.first || j != e.second) {
            now.emplace_back(i, j);
          }
        }
      }
      ans.push_back({now[0], now[1], now[2]});
      g[now[0].first][now[0].second] = !g[now[0].first][now[0].second];
      g[now[1].first][now[1].second] = !g[now[1].first][now[1].second];
      g[now[2].first][now[2].second] = !g[now[2].first][now[2].second];
    }
    cout << ((int)(ans).size()) << endl;
    for (int i = 0; i < (((int)(ans).size())); ++i) {
      auto [p1, p2, p3] = ans[i];
      auto [x1, y1] = p1;
      auto [x2, y2] = p2;
      auto [x3, y3] = p3;
      cout << x1 + 1 << " " << y1 + 1 << " " << x2 + 1 << " " << y2 + 1 << " "
           << x3 + 1 << " " << y3 + 1 << endl;
    }
  }
  return 0;
}
