#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long int t;
  cin >> t;
  while (t--) {
    vector<pair<long long int, long long int>> v;
    long long int n, m;
    cin >> n >> m;
    char a[n][m];
    for (long long int i = 0; i < n; i++) {
      for (long long int j = 0; j < m; j++) {
        cin >> a[i][j];
      }
    }
    for (long long int i = 0; i < n; i++) {
      for (long long int j = 0; j < m; j++) {
        if ((((i + j) != (m + n - 2)) && ((i + j) != (m + n - 4)) &&
             ((i + j) != (m + n - 3)) && ((i + j) != (m + n - 2))) &&
            i == n - 2) {
          if (a[i][j] == '1') {
            v.push_back({i + 1, j + 1});
            v.push_back({i + 1, j + 2});
            v.push_back({i + 2, j + 2});
            a[i][j] = '0' + (1 ^ (a[i][j] - '0'));
            a[i][j + 1] = '0' + (1 ^ (a[i][j + 1] - '0'));
            a[i + 1][j + 1] = '0' + (1 ^ (a[i + 1][j + 1] - '0'));
          }
          if (a[i + 1][j] == '1') {
            v.push_back({i + 2, j + 1});
            v.push_back({i + 1, j + 2});
            v.push_back({i + 2, j + 2});
            a[i + 1][j] = '0' + (1 ^ (a[i + 1][j] - '0'));
            a[i][j + 1] = '0' + (1 ^ (a[i][j + 1] - '0'));
            a[i + 1][j + 1] = '0' + (1 ^ (a[i + 1][j + 1] - '0'));
          }
        } else if ((((i + j) != (m + n - 2)) && ((i + j) != (m + n - 4)) &&
                    ((i + j) != (m + n - 3)) && ((i + j) != (m + n - 2))) &&
                   j == m - 2) {
          if (a[i][j] == '1') {
            v.push_back({i + 1, j + 1});
            v.push_back({i + 2, j + 1});
            v.push_back({i + 2, j + 2});
            a[i][j] = '0' + (1 ^ (a[i][j] - '0'));
            a[i + 1][j] = '0' + (1 ^ (a[i + 1][j] - '0'));
            a[i + 1][j + 1] = '0' + (1 ^ (a[i + 1][j + 1] - '0'));
          }
          if (a[i][j + 1] == '1') {
            v.push_back({i + 1, j + 2});
            v.push_back({i + 2, j + 1});
            v.push_back({i + 2, j + 2});
            a[i][j + 1] = '0' + (1 ^ (a[i][j + 1] - '0'));
            a[i + 1][j] = '0' + (1 ^ (a[i + 1][j] - '0'));
            a[i + 1][j + 1] = '0' + (1 ^ (a[i + 1][j + 1] - '0'));
          }
        } else if (((i + j) != (m + n - 2)) && ((i + j) != (m + n - 4)) &&
                   ((i + j) != (m + n - 3)) && ((i + j) != (m + n - 2))) {
          if (a[i][j] == '1') {
            v.push_back({i + 1, j + 1});
            v.push_back({i + 2, j + 1});
            v.push_back({i + 1, j + 2});
            a[i][j] = '0' + (1 ^ (a[i][j] - '0'));
            a[i + 1][j] = '0' + (1 ^ (a[i + 1][j] - '0'));
            a[i][j + 1] = '0' + (1 ^ (a[i][j + 1] - '0'));
          }
        }
      }
    }
    swap(m, n);
    long long int x = 0;
    x += ((a[m - 1][n - 1] - '0') + (a[m - 1][n - 2] - '0') +
          (a[m - 2][n - 1] - '0') + (a[m - 2][n - 2] - '0'));
    long long int p = a[m - 1][n - 1] - '0', q = a[m - 2][n - 1] - '0',
                  r = a[m - 2][n - 2] - '0', s = a[m - 1][n - 2] - '0';
    if (x == 1) {
      vector<pair<long long int, long long int>> g;
      vector<pair<long long int, long long int>> g1;
      if (p == 1) {
        g.push_back({m, n});
      } else {
        g1.push_back({m, n});
      }
      if (q == 1) {
        g.push_back({m - 1, n});
      } else {
        g1.push_back({m - 1, n});
      }
      if (r == 1) {
        g.push_back({m - 1, n - 1});
      } else {
        g1.push_back({m - 1, n - 1});
      }
      if (s == 1) {
        g.push_back({m, n - 1});
      } else {
        g1.push_back({m, n - 1});
      }
      v.push_back({g[0].first, g[0].second});
      v.push_back({g1[1].first, g1[1].second});
      v.push_back({g1[0].first, g1[0].second});
      v.push_back({g[0].first, g[0].second});
      v.push_back({g1[2].first, g1[2].second});
      v.push_back({g1[0].first, g1[0].second});
      v.push_back({g1[1].first, g1[1].second});
      v.push_back({g1[2].first, g1[2].second});
      v.push_back({g[0].first, g[0].second});
    }
    if (x == 2) {
      vector<pair<long long int, long long int>> g;
      vector<pair<long long int, long long int>> g1;
      if (p == 1) {
        g1.push_back({m, n});
      } else {
        g.push_back({m, n});
      }
      if (q == 1) {
        g1.push_back({m - 1, n});
      } else {
        g.push_back({m - 1, n});
      }
      if (r == 1) {
        g1.push_back({m - 1, n - 1});
      } else {
        g.push_back({m - 1, n - 1});
      }
      if (s == 1) {
        g1.push_back({m, n - 1});
      } else {
        g.push_back({m, n - 1});
      }
      v.push_back({g[0].first, g[0].second});
      v.push_back({g[1].first, g[1].second});
      v.push_back({g1[0].first, g1[0].second});
      v.push_back({g[0].first, g[0].second});
      v.push_back({g[1].first, g[1].second});
      v.push_back({g1[1].first, g1[1].second});
    }
    if (x == 3) {
      if (p != 0) {
        v.push_back({m, n});
      }
      if (q != 0) {
        v.push_back({m - 1, n});
      }
      if (r != 0) {
        v.push_back({m - 1, n - 1});
      }
      if (s != 0) {
        v.push_back({m, n - 1});
      }
    }
    if (x == 4) {
      v.push_back({m, n});
      v.push_back({m - 1, n});
      v.push_back({m - 1, n - 1});
      v.push_back({m, n - 1});
      v.push_back({m - 1, n});
      v.push_back({m - 1, n - 1});
      v.push_back({m, n - 1});
      v.push_back({m - 1, n - 1});
      v.push_back({m, n});
      v.push_back({m, n});
      v.push_back({m - 1, n});
      v.push_back({m, n - 1});
    }
    cout << (v.size()) / 3 << endl;
    for (long long int i = 0; i < v.size(); i += 3) {
      for (long long int j = i; j < i + 3; j++) {
        cout << v[j].first << " " << v[j].second << " ";
      }
      cout << endl;
    }
  }
  return 0;
}
