#include <bits/stdc++.h>
using namespace std;
void flip(vector<vector<int>> &a, vector<pair<int, int>> &z, int i, int j) {
  z.push_back({i, j});
  a[i][j] ^= 1;
}
void fix(vector<vector<int>> &a, vector<pair<int, int>> &z, int i, int j) {
  int n = a.size(), m = a[0].size();
  if (i == n - 1) {
    i--;
  }
  if (j == m - 1) {
    j--;
  }
  int r = a[i][j] + a[i + 1][j] + a[i][j + 1] + a[i + 1][j + 1];
  vector<pair<int, int>> x, y;
  for (int f = 0; f < 2; f++) {
    for (int s = 0; s < 2; s++) {
      if (a[i + f][j + s]) {
        x.push_back({i + f, j + s});
      } else {
        y.push_back({i + f, j + s});
      }
    }
  }
  if (r == 4) {
    flip(a, z, i, j);
    flip(a, z, i, j + 1);
    flip(a, z, i + 1, j + 1);
    flip(a, z, i + 1, j + 1);
    flip(a, z, i, j + 1);
    flip(a, z, i + 1, j);
  } else if (r == 3) {
    if (a[i][j]) {
      flip(a, z, i, j);
    }
    if (a[i][j + 1]) {
      flip(a, z, i, j + 1);
    }
    if (a[i + 1][j]) {
      flip(a, z, i + 1, j);
    }
    if (a[i + 1][j + 1]) {
      flip(a, z, i + 1, j + 1);
    }
  } else if (r == 2) {
    flip(a, z, x[0].first, x[0].second);
    flip(a, z, y[0].first, y[0].second);
    flip(a, z, y[1].first, y[1].second);
    flip(a, z, y[0].first, y[0].second);
    flip(a, z, y[1].first, y[1].second);
    flip(a, z, x[1].first, x[1].second);
  } else if (r == 1) {
    flip(a, z, x[0].first, x[0].second);
    flip(a, z, y[0].first, y[0].second);
    flip(a, z, y[1].first, y[1].second);
    fix(a, z, i, j);
  }
}
void solve() {
  int n, m;
  cin >> n >> m;
  vector<vector<int>> a(n, vector<int>(m));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      char c;
      cin >> c;
      a[i][j] = c - '0';
    }
  }
  vector<pair<int, int>> z;
  for (int i = 0; i < n - 1; i++) {
    for (int j = 1; j < m; j += 2) {
      if (a[i][j] == 1 && a[i][j - 1] == 1) {
        flip(a, z, i, j);
        flip(a, z, i, j - 1);
        flip(a, z, i + 1, j);
      } else if (a[i][j] + a[i][j - 1]) {
        flip(a, z, i + 1, j);
        flip(a, z, i + 1, j - 1);
        if (a[i][j] == 1) {
          flip(a, z, i, j);
        } else {
          flip(a, z, i, j - 1);
        }
      }
      if (m % 2 == 1 && j == m - 2) {
        j--;
      }
    }
  }
  for (int j = 0; j < m - 3; j++) {
    int i = n - 1;
    if (a[i][j] == 0) {
      continue;
    }
    if (a[i][j + 1] == 1) {
      flip(a, z, i, j);
      flip(a, z, i - 1, j);
      flip(a, z, i - 1, j + 1);
      flip(a, z, i, j + 1);
      flip(a, z, i - 1, j);
      flip(a, z, i - 1, j + 1);
    } else if (a[i][j + 2] == 1) {
      flip(a, z, i, j);
      flip(a, z, i, j + 1);
      flip(a, z, i - 1, j + 1);
      flip(a, z, i, j + 1);
      flip(a, z, i - 1, j + 1);
      flip(a, z, i, j + 2);
    } else {
      flip(a, z, i, j);
      flip(a, z, i - 1, j);
      flip(a, z, i - 1, j + 1);
      flip(a, z, i - 1, j + 1);
      flip(a, z, i, j);
      flip(a, z, i, j + 1);
      flip(a, z, i - 1, j);
      flip(a, z, i, j);
      flip(a, z, i, j + 1);
    }
  }
  if (m == 2) {
    fix(a, z, n - 2, m - 2);
  } else {
    int i = n - 1, j = m - 1;
    int s = a[i][j] + a[i][j - 1] + a[i][j - 2];
    if (s <= 1) {
      fix(a, z, i - 1, j - 2);
      fix(a, z, i - 1, j - 1);
    } else if (s == 3) {
      flip(a, z, i, j);
      flip(a, z, i - 1, j - 1);
      flip(a, z, i, j - 1);
      fix(a, z, i - 1, j - 2);
    } else {
      if (a[i][j] && a[i][j - 1]) {
        fix(a, z, i - 1, j - 1);
      } else if (a[i][j - 1] && a[i][j - 2]) {
        fix(a, z, i - 1, j - 2);
      } else {
        flip(a, z, i, j);
        flip(a, z, i, j - 1);
        flip(a, z, i - 1, j - 1);
        fix(a, z, i - 1, j - 2);
      }
    }
  }
  cout << (int)(z.size()) / 3 << endl;
  for (int i = 0; i < z.size(); i += 3) {
    for (int j = 0; j < 3; j++) {
      cout << z[i + j].first + 1 << " " << z[i + j].second + 1 << ' ';
    }
    cout << endl;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int t;
  cin >> t;
  while (t--) {
    solve();
  }
  return 0;
}
