#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 * 31 + 10;
const int mod = 1e9 + 7;
int z[110][110];
int ys[110][110];
char tmp[110];
struct node {
  int x1, y1, x2, y2, x3, y3;
};
int tot;
vector<node> ans;
int ned[] = {0, 2, 3, 0, 1};
void cao(int i, int j) {
  int x1 = i, y1 = j, x2 = i, y2 = j + 1;
  int x3 = i + 1, y3 = j, x4 = i + 1, y4 = j + 1;
  int cnt = z[x1][y1] + z[x2][y2] + z[x3][y3] + z[x4][y4];
  while (cnt != 0) {
    for (int sta = 0; sta <= 15; sta++) {
      int fc = 0;
      int hs = 0;
      int a, b, c, d;
      a = (sta >> 3) & 1;
      b = (sta >> 2) & 1;
      c = (sta >> 1) & 1;
      d = sta & 1;
      if (a + b + c + d == ned[cnt]) {
        if (z[x1][y1] != a) fc++;
        if (z[x2][y2] != b) fc++;
        if (z[x3][y3] != c) fc++;
        if (z[x4][y4] != d) fc++;
        if (fc == 3) {
          vector<int> v;
          if (z[x1][y1] != a) z[x1][y1] ^= 1, v.push_back(x1), v.push_back(y1);
          if (z[x2][y2] != b) z[x2][y2] ^= 1, v.push_back(x2), v.push_back(y2);
          if (z[x3][y3] != c) z[x3][y3] ^= 1, v.push_back(x3), v.push_back(y3);
          if (z[x4][y4] != d) z[x4][y4] ^= 1, v.push_back(x4), v.push_back(y4);
          cnt = ned[cnt];
          tot++;
          ans.push_back({v[0], v[1], v[2], v[3], v[4], v[5]});
          break;
        }
      }
    }
  }
}
int main() {
  int t;
  cin >> t;
  while (t--) {
    int n, m;
    cin >> n >> m;
    tot = 0;
    ans.clear();
    for (int i = 1; i <= n; i++) {
      scanf("%s", tmp + 1);
      for (int j = 1; j <= m; j++) z[i][j] = tmp[j] - '0';
    }
    if (n & 1) {
      int ed = m;
      if (m & 1) ed--;
      for (int j = 1; j <= ed; j += 2) {
        vector<int> v;
        int cnt = 3;
        if (z[n][j]) cnt--, z[n][j] = 0, v.push_back(n), v.push_back(j);
        if (z[n][j + 1])
          cnt--, z[n][j + 1] = 0, v.push_back(n), v.push_back(j + 1);
        if (cnt == 1)
          z[n - 1][j] ^= 1, v.push_back(n - 1), v.push_back(j);
        else if (cnt == 2)
          z[n - 1][j] ^= 1, z[n - 1][j + 1] ^= 1, v.push_back(n - 1),
              v.push_back(j), v.push_back(n - 1), v.push_back(j + 1);
        else
          continue;
        tot++;
        ans.push_back({v[0], v[1], v[2], v[3], v[4], v[5]});
      }
    }
    if (m & 1) {
      int ed = n;
      if (n & 1) ed--;
      for (int j = 1; j <= ed; j += 2) {
        vector<int> v;
        int cnt = 3;
        if (z[j][m]) cnt--, z[j][m] = 0, v.push_back(j), v.push_back(m);
        if (z[j + 1][m])
          cnt--, z[j + 1][m] = 0, v.push_back(j + 1), v.push_back(m);
        if (cnt == 1)
          z[j][m - 1] ^= 1, v.push_back(j), v.push_back(m - 1);
        else if (cnt == 2)
          z[j][m - 1] ^= 1, z[j + 1][m - 1] ^= 1, v.push_back(j),
              v.push_back(m - 1), v.push_back(j + 1), v.push_back(m - 1);
        else
          continue;
        tot++;
        ans.push_back({v[0], v[1], v[2], v[3], v[4], v[5]});
      }
    }
    int rn = n - n % 2;
    int rm = m - m % 2;
    for (int i = 1; i <= rn; i += 2)
      for (int j = 1; j <= rm; j += 2) cao(i, j);
    if (n & 1 && m & 1) cao(n - 1, m - 1);
    cout << tot << endl;
    for (auto &i : ans)
      cout << i.x1 << " " << i.y1 << " " << i.x2 << " " << i.y2 << " " << i.x3
           << " " << i.y3 << endl;
  }
  return 0;
}
