#include <bits/stdc++.h>
using namespace std;
char s[1002][1002];
struct point {
  int x;
  int y;
} ppoint;
point ans[30000 + 100];
int ansCnt = 0;
struct Node {
  point p[4];
} node;
void add(Node &node, int x, int y, int &cnt) {
  ans[ansCnt].x = x;
  ans[ansCnt++].y = y;
  if (s[x][y] == '0')
    s[x][y] = '1';
  else
    s[x][y] = '0';
  node.p[cnt].x = x;
  node.p[cnt++].y = y;
}
void check(Node &node, int x, int y, int &cnt, int n, int m) {
  if (x < 1 || x > n || y < 1 || y > m) return;
  if (s[x][y] == '1') add(node, x, y, cnt);
}
void add2(Node &node, point *pp, int aa, int bb, int cc, int &cnt) {
  cnt = 0;
  add(node, pp[aa].x, pp[aa].y, cnt);
  add(node, pp[bb].x, pp[bb].y, cnt);
  add(node, pp[cc].x, pp[cc].y, cnt);
}
void dayin(int x, int n, int m) {
  cout << x << "******begin********\n";
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) cout << s[i][j];
    puts("");
  }
  cout << x << "*******end*********\n";
}
int main() {
  int t;
  scanf("%d", &t);
  int tt = 0;
  while (t--) {
    tt++;
    ansCnt = 0;
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
      scanf("%s", s[i] + 1);
    }
    for (int i = 1; i < n; i++) {
      for (int j = 1; j <= m; j++) {
        if (s[i][j] == '1') {
          int cnt = 0;
          add(node, i, j, cnt);
          if (j + 1 <= m && s[i][j + 1] == '1') {
            add(node, i, j + 1, cnt);
            check(node, i + 1, j, cnt, n, m);
            if (cnt < 3) {
              check(node, i + 1, j + 1, cnt, n, m);
            }
            if (cnt < 3) {
              add(node, i + 1, j + 1, cnt);
            }
          } else {
            add(node, i + 1, j, cnt);
            check(node, i + 1, j - 1, cnt, n, m);
            if (cnt < 3) {
              check(node, i + 1, j + 1, cnt, n, m);
            }
            if (cnt < 3 && j + 1 <= m) {
              add(node, i + 1, j + 1, cnt);
            }
            if (cnt < 3 && j - 1 >= 1) {
              add(node, i + 1, j - 1, cnt);
            }
          }
        }
      }
    }
    int cnt = 0;
    point p[5];
    int x;
    int y;
    for (int j = 1; j <= m - 2; j++) {
      cnt = 0;
      p[5];
      x = n;
      y = j;
      p[1].x = x - 1;
      p[1].y = y;
      p[2].x = x - 1;
      p[2].y = y + 1;
      p[3].x = x;
      p[3].y = y;
      p[4].x = x;
      p[4].y = y + 1;
      if (s[n - 1][j] == '1' && s[n][j] == '1') {
        add2(node, p, 1, 3, 4, cnt);
      } else if (s[n - 1][j] == '0' && s[n][j] == '1') {
        add2(node, p, 2, 3, 4, cnt);
      } else if (s[n - 1][j] == '1' && s[n][j] == '0') {
        add2(node, p, 1, 2, 4, cnt);
      }
    }
    x = n;
    y = m;
    p[1].x = x - 1;
    p[1].y = y - 1;
    p[2].x = x - 1;
    p[2].y = y;
    p[3].x = x;
    p[3].y = y - 1;
    p[4].x = x;
    p[4].y = y;
    cnt = 0;
    if (s[n - 1][m - 1] == '0' && s[n][m - 1] == '0' && s[n][m] == '1') {
      add2(node, p, 1, 2, 4, cnt);
      add2(node, p, 2, 3, 4, cnt);
      add2(node, p, 1, 3, 4, cnt);
    }
    if (s[n - 1][m - 1] == '0' && s[n][m - 1] == '1' && s[n][m] == '0') {
      add2(node, p, 1, 2, 3, cnt);
      add2(node, p, 2, 3, 4, cnt);
      add2(node, p, 1, 3, 4, cnt);
    }
    if (s[n - 1][m - 1] == '0' && s[n][m - 1] == '1' && s[n][m] == '1') {
      add2(node, p, 1, 2, 3, cnt);
      add2(node, p, 1, 2, 4, cnt);
    }
    if (s[n - 1][m - 1] == '1' && s[n][m - 1] == '0' && s[n][m] == '0') {
      add2(node, p, 1, 2, 3, cnt);
      add2(node, p, 1, 2, 4, cnt);
      add2(node, p, 1, 3, 4, cnt);
    }
    if (s[n - 1][m - 1] == '1' && s[n][m - 1] == '0' && s[n][m] == '1') {
      add2(node, p, 1, 2, 3, cnt);
      add2(node, p, 2, 3, 4, cnt);
    }
    if (s[n - 1][m - 1] == '1' && s[n][m - 1] == '1' && s[n][m] == '0') {
      add2(node, p, 1, 2, 4, cnt);
      add2(node, p, 2, 3, 4, cnt);
    }
    if (s[n - 1][m - 1] == '1' && s[n][m - 1] == '1' && s[n][m] == '1') {
      add2(node, p, 1, 3, 4, cnt);
    }
    printf("%d ", ansCnt / 3);
    for (int i = 0; i < ansCnt; i++) printf("%d %d ", ans[i].x, ans[i].y);
    printf("\n");
  }
}
