#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int t;
  cin >> t;
  while (t--) {
    int n, m;
    cin >> n >> m;
    vector<string> b(n);
    for (int i = 0; i < n; i++) cin >> b[i];
    vector<tuple<pair<int, int>, pair<int, int>, pair<int, int>>> sol;
    for (int i = 0; i < n - 1; i++)
      for (int j = 0; j < m - 1; j++) {
        vector<pair<int, int>> ts;
        if (b[i][j] == '1') {
          ts.push_back({i, j});
        }
        if (b[i][j + 1] == '1') {
          ts.push_back({i, j + 1});
        }
        if (b[i + 1][j] == '1' || ts.size() == 1) {
          ts.push_back({i + 1, j});
        }
        if (b[i + 1][j + 1] == '1' || ts.size() == 2) {
          ts.push_back({i + 1, j + 1});
        }
        if (ts.size() >= 3) {
          for (int i = 0; i < 3; i++) {
            auto x = ts[i];
            b[x.first][x.second] = '0' + '1' - b[x.first][x.second];
          }
          sol.push_back(make_tuple(ts[0], ts[1], ts[2]));
        }
      }
    for (int j = 0; j < m - 2; j++) {
      vector<pair<int, int>> ts;
      if (b[n - 2][j] == '1') {
        ts.push_back({n - 2, j});
      }
      if (b[n - 1][j] == '1') {
        ts.push_back({n - 1, j});
      }
      if (b[n - 2][j + 1] == '1' || ts.size() == 1) {
        ts.push_back({n - 2, j + 1});
      }
      if (b[n - 1][j + 1] == '1' || ts.size() == 2) {
        ts.push_back({n - 1, j + 1});
      }
      if (ts.size() >= 3) {
        for (int i = 0; i < 3; i++) {
          auto x = ts[i];
          b[x.first][x.second] = '0' + '1' - b[x.first][x.second];
        }
        sol.push_back(make_tuple(ts[0], ts[1], ts[2]));
      }
    }
    vector<pair<int, int>> p;
    for (int i = 0; i < n; i++) cerr << b[i] << '\n';
    for (int v = 0; v < 4; v++) {
      vector<pair<int, int>> z, o;
      for (int i = 0; i < 2; i++)
        for (int j = 0; j < 2; j++) {
          if (b[n - i - 1][m - j - 1] == '0') {
            z.push_back({n - i - 1, m - j - 1});
          } else {
            o.push_back({n - i - 1, m - j - 1});
          }
        }
      if (!o.size()) break;
      vector<pair<int, int>> s;
      if (o.size() >= 3) {
        s = o;
      } else {
        s.push_back({o[0].first, o[0].second});
        s.push_back({z[0].first, z[0].second});
        s.push_back({z[1].first, z[1].second});
      }
      for (int i = 0; i < 3; i++) {
        auto x = s[i];
        b[x.first][x.second] = '0' + '1' - b[x.first][x.second];
      }
      sol.push_back(make_tuple(s[0], s[1], s[2]));
    }
    cout << sol.size() << '\n';
    for (auto x : sol) {
      cout << get<0>(x).first + 1 << " " << get<0>(x).second + 1 << " "
           << get<1>(x).first + 1 << " " << get<1>(x).second + 1 << " "
           << get<2>(x).first + 1 << " " << get<2>(x).second + 1 << '\n';
    }
    for (int i = 0; i < n; i++) cerr << b[i] << '\n';
  }
}
