#include <bits/stdc++.h>
using namespace std;
char ch[1010][1010];
long long n, m, cnt;
vector<int> v[10010];
struct {
  int x, y;
} a, b, c, d;
void change(int i, int j) {
  if (ch[i][j] == '1')
    ch[i][j] = '0';
  else
    ch[i][j] = '1';
}
void did(int x1, int y1, int x2, int y2, int x3, int y3) {
  change(x1, y1);
  change(x2, y2);
  change(x3, y3);
  v[++cnt].push_back(x1);
  v[cnt].push_back(y1);
  v[cnt].push_back(x2);
  v[cnt].push_back(y2);
  v[cnt].push_back(x3);
  v[cnt].push_back(y3);
}
int main() {
  int t;
  scanf("%d", &t);
  while (t--) {
    cnt = 0;
    for (int i = 1; i <= 10001; ++i) v[i].clear();
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; ++i) scanf("%s", ch[i] + 1);
    for (int i = 1; i <= n - 2; ++i) {
      for (int j = 1; j < m; ++j) {
        if (ch[i][j] == '1') {
          did(i, j, i + 1, j, i + 1, j + 1);
        }
      }
      if (ch[i][m] == '1') {
        did(i, m, i + 1, m, i + 1, m - 1);
      }
    }
    for (int j = 1; j < m - 1; ++j) {
      if (ch[n - 1][j] == '1') {
        if (ch[n][j] == '1') {
          did(n - 1, j, n, j, n, j + 1);
        } else {
          did(n - 1, j, n - 1, j + 1, n, j + 1);
        }
      } else {
        if (ch[n][j] == '1') {
          did(n, j, n - 1, j + 1, n, j + 1);
        }
      }
    }
    a.x = n - 1, a.y = m - 1;
    b.x = n - 1, b.y = m;
    c.x = n, c.y = m - 1;
    d.x = n, d.y = m;
    if (ch[n - 1][m - 1] == '1') {
      if (ch[n - 1][m] == '1') {
        if (ch[n][m - 1] == '1') {
          if (ch[n][m] == '1') {
            did(a.x, a.y, b.x, b.y, d.x, d.y);
            did(a.x, a.y, c.x, c.y, d.x, d.y);
            did(a.x, a.y, b.x, b.y, c.x, c.y);
            did(b.x, b.y, c.x, c.y, d.x, d.y);
          } else {
            did(a.x, a.y, b.x, b.y, c.x, c.y);
          }
        } else {
          if (ch[n][m] == '1') {
            did(a.x, a.y, b.x, b.y, d.x, d.y);
          } else {
            did(b.x, b.y, c.x, c.y, d.x, d.y);
            did(a.x, a.y, c.x, c.y, d.x, d.y);
          }
        }
      } else {
        if (ch[n][m - 1] == '1') {
          if (ch[n][m] == '1') {
            did(a.x, a.y, c.x, c.y, d.x, d.y);
          } else {
            did(b.x, b.y, c.x, c.y, d.x, d.y);
            did(a.x, a.y, b.x, b.y, d.x, d.y);
          }
        } else {
          if (ch[n][m] == '1') {
            did(b.x, b.y, c.x, c.y, d.x, d.y);
            did(a.x, a.y, b.x, b.y, c.x, c.y);
          } else {
            did(a.x, a.y, b.x, b.y, d.x, d.y);
            did(a.x, a.y, c.x, c.y, d.x, d.y);
            did(a.x, a.y, b.x, b.y, c.x, c.y);
          }
        }
      }
    } else {
      if (ch[n - 1][m] == '1') {
        if (ch[n][m - 1] == '1') {
          if (ch[n][m] == '1') {
            did(b.x, b.y, c.x, c.y, d.x, d.y);
          } else {
            did(a.x, a.y, b.x, b.y, d.x, d.y);
            did(a.x, a.y, c.x, c.y, d.x, d.y);
          }
        } else {
          if (ch[n][m] == '1') {
            did(a.x, a.y, c.x, c.y, d.x, d.y);
            did(a.x, a.y, b.x, b.y, c.x, c.y);
          } else {
            did(a.x, a.y, b.x, b.y, c.x, c.y);
            did(a.x, a.y, b.x, b.y, d.x, d.y);
            did(b.x, b.y, c.x, c.y, d.x, d.y);
          }
        }
      } else {
        if (ch[n][m - 1] == '1') {
          if (ch[n][m] == '1') {
            did(a.x, a.y, b.x, b.y, c.x, c.y);
            did(a.x, a.y, b.x, b.y, d.x, d.y);
          } else {
            did(a.x, a.y, b.x, b.y, c.x, c.y);
            did(a.x, a.y, c.x, c.y, d.x, d.y);
            did(b.x, b.y, c.x, c.y, d.x, d.y);
          }
        } else {
          if (ch[n][m] == '1') {
            did(a.x, a.y, b.x, b.y, d.x, d.y);
            did(a.x, a.y, c.x, c.y, d.x, d.y);
            did(b.x, b.y, c.x, c.y, d.x, d.y);
          }
        }
      }
    }
    printf("%lld\n", cnt);
    for (int i = 1; i <= cnt; ++i) {
      for (int j = 0; j < v[i].size(); ++j) {
        printf("%d ", v[i][j]);
      }
      printf("\n");
    }
  }
  return 0;
}
