#include <bits/stdc++.h>
using namespace std;
char mpp[110][110];
int mp[110][110];
struct node {
  int x1, y1, x2, y2, x3, y3;
  node(int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0, int x3 = 0, int y3 = 0)
      : x1(x1), y1(y1), x2(x2), y2(y2), x3(x3), y3(y3) {}
};
node ans[110 * 110];
int cnt;
void change(int x1, int y1, int x2, int y2, int x3, int y3) {
  ans[cnt++] = node(x1, y1, x2, y2, x3, y3);
  mp[x1][y1] ^= 1, mp[x2][y2] ^= 1, mp[x3][y3] ^= 1;
}
void debug(int n, int m) {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      printf("%d ", mp[i][j]);
    }
    cout << endl;
  }
}
int main() {
  int t;
  cin >> t;
  while (t--) {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
      scanf("%s", mpp[i] + 1);
      for (int j = 1; j <= m; j++) mp[i][j] = mpp[i][j] - '0';
    }
    cnt = 0;
    for (int i = 1; i <= n - 2; ++i) {
      for (int j = 1; j <= m - 1; ++j) {
        if (mp[i][j]) {
          change(i, j, i, j + 1, i + 1, j + 1);
        }
      }
      if (mp[i][m]) {
        change(i, m, i + 1, m, i + 1, m - 1);
      }
    }
    int i = n - 1;
    for (int j = 1; j <= m - 2; j++) {
      if (mp[i][j]) {
        change(i, j, i, j + 1, i + 1, j + 1);
      }
      if (mp[i + 1][j]) {
        change(i + 1, j, i + 1, j + 1, i, j + 1);
      }
    }
    int j = m - 1;
    int tmp = mp[i][j] + mp[n][m] + mp[i][m] + mp[n][j];
    if (tmp == 4) {
      change(i, m, n, j, n, m), change(i, j, n, j, n, m),
          change(i, j, i, m, n, m), change(i, j, i, m, n, j);
    } else if (tmp == 3) {
      if (mp[i][j] == 0)
        change(i, m, n, j, n, m);
      else if (!mp[i][m])
        change(i, j, n, j, n, m);
      else if (!mp[n][j])
        change(i, j, i, m, n, m);
      else if (!mp[n][m])
        change(i, j, i, m, n, j);
    } else if (tmp == 2) {
      if (mp[i][j] == 1 && mp[i][m])
        change(i, m, n, j, n, m), change(i, j, n, j, n, m);
      else if (mp[i][j] && mp[n][j])
        change(i, m, n, j, n, m), change(i, j, i, m, n, m);
      else if (mp[i][m] && mp[n][m])
        change(i, j, n, j, n, m), change(i, j, i, m, n, j);
      else if (mp[n][j] && mp[n][m])
        change(i, j, i, m, n, m), change(i, j, i, m, n, j);
      else if (mp[i][j] && mp[n][m])
        change(i, m, n, j, n, m), change(i, j, i, m, n, j);
      else if (mp[i][m] && mp[n][j])
        change(i, j, n, j, n, m), change(i, j, i, m, n, m);
    } else if (tmp == 1) {
      if (mp[i][j] == 1)
        change(i, j, n, j, n, m), change(i, j, i, m, n, m),
            change(i, j, i, m, n, j);
      else if (mp[i][m])
        change(i, m, n, j, n, m), change(i, j, i, m, n, m),
            change(i, j, i, m, n, j);
      else if (mp[n][j])
        change(i, j, i, m, n, j), change(i, m, n, j, n, m),
            change(i, j, n, j, n, m);
      else if (mp[n][m])
        change(i, j, i, m, n, m), change(i, m, n, j, n, m),
            change(i, j, n, j, n, m);
    }
    printf("%d\n", cnt);
    for (int k = 0; k < cnt; ++k) {
      node &x = ans[k];
      printf("%d %d %d %d %d %d\n", x.x1, x.y1, x.x2, x.y2, x.x3, x.y3);
    }
    cout << flush;
  }
  return 0;
}
