#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e2 + 20;
const int mod = 1e9 + 7;
int n, m, a[maxn][maxn];
struct qnode {
  pair<int, int> pos[3];
} op[maxn * maxn * maxn];
int tot = 0;
void change(int id) {
  for (int i = 0; i < 3; i++) {
    a[op[id].pos[i].first][op[id].pos[i].second] ^= 1;
  }
}
void solve4(int x, int y) {
  int cnt = 0;
  for (int i = (x); i <= (x + 1); ++i) {
    for (int j = (y); j <= (y + 1); ++j) {
      if (cnt == 3) break;
      op[tot].pos[cnt++] = {i, j};
    }
  }
  change(tot++);
}
void solve1(int x, int y) {
  int cnt = 0;
  for (int i = (x); i <= (x + 1); ++i) {
    for (int j = (y); j <= (y + 1); ++j) {
      if (cnt == 3) break;
      if (a[i][j] == 0 && cnt < 2) op[tot].pos[cnt++] = {i, j};
    }
  }
  for (int i = (x); i <= (x + 1); ++i) {
    for (int j = (y); j <= (y + 1); ++j) {
      if (cnt == 3) break;
      if (a[i][j]) op[tot].pos[cnt++] = {i, j};
    }
  }
  change(tot++);
}
void solve2(int x, int y) {
  int cnt = 0;
  for (int i = (x); i <= (x + 1); ++i) {
    for (int j = (y); j <= (y + 1); ++j) {
      if (cnt == 3) break;
      if (a[i][j] == 0 && cnt < 2) op[tot].pos[cnt++] = {i, j};
    }
  }
  for (int i = (x); i <= (x + 1); ++i) {
    for (int j = (y); j <= (y + 1); ++j) {
      if (cnt == 3) break;
      if (a[i][j]) op[tot].pos[cnt++] = {i, j};
    }
  }
  change(tot++);
}
void solve3(int x, int y) {
  int cnt = 0;
  for (int i = (x); i <= (x + 1); ++i) {
    for (int j = (y); j <= (y + 1); ++j) {
      if (cnt == 3) break;
      if (a[i][j]) op[tot].pos[cnt++] = {i, j};
    }
  }
  change(tot++);
}
int main(int argc, char const *argv[]) {
  int t;
  scanf("%d", &t);
  while (t--) {
    tot = 0;
    scanf("%d%d", &n, &m);
    for (int i = (1); i <= (n); ++i) {
      for (int j = (1); j <= (m); ++j) {
        scanf("%1d", &a[i][j]);
      }
    }
    if (n % 2) {
      for (int j = (1); j <= (m - 1); ++j) {
        int cnt = 0;
        if (a[n][j] || a[n][j + 1]) {
          if (a[n][j]) {
            op[tot].pos[cnt++] = {n, j};
            a[n][j] ^= 1;
          }
          if (a[n][j + 1]) {
            op[tot].pos[cnt++] = {n, j + 1};
            a[n][j + 1] ^= 1;
          }
          if (cnt < 3) {
            op[tot].pos[cnt++] = {n - 1, j};
            a[n - 1][j] ^= 1;
          }
          if (cnt < 3) {
            op[tot].pos[cnt++] = {n - 1, j + 1};
            a[n - 1][j + 1] ^= 1;
          }
          tot++;
        }
      }
      n--;
    }
    if (m % 2) {
      for (int i = (1); i <= (n - 1); ++i) {
        int cnt = 0;
        if (a[i][m] || a[i + 1][m]) {
          if (a[i][m]) {
            op[tot].pos[cnt++] = {i, m};
            a[i][m] ^= 1;
          }
          if (a[i + 1][m]) {
            op[tot].pos[cnt++] = {i + 1, m};
            a[i + 1][m] ^= 1;
          }
          if (cnt < 3) {
            op[tot].pos[cnt++] = {i, m - 1};
            a[i][m - 1] ^= 1;
          }
          if (cnt < 3) {
            op[tot].pos[cnt++] = {i + 1, m - 1};
            a[i + 1][m - 1] ^= 1;
          }
          tot++;
        }
      }
      m--;
    }
    for (int i = 1; i <= n; i += 2) {
      for (int j = 1; j <= m; j += 2) {
        int sum = a[i][j] + a[i + 1][j] + a[i][j + 1] + a[i + 1][j + 1];
        if (sum == 4) solve4(i, j);
        sum = a[i][j] + a[i + 1][j] + a[i][j + 1] + a[i + 1][j + 1];
        if (sum == 1) solve1(i, j);
        sum = a[i][j] + a[i + 1][j] + a[i][j + 1] + a[i + 1][j + 1];
        if (sum == 2) solve2(i, j);
        sum = a[i][j] + a[i + 1][j] + a[i][j + 1] + a[i + 1][j + 1];
        if (sum == 3) solve3(i, j);
        sum = a[i][j] + a[i + 1][j] + a[i][j + 1] + a[i + 1][j + 1];
      }
    }
    printf("%d\n", tot);
    for (int i = (0); i <= (tot - 1); ++i) {
      for (int j = (0); j <= (2); ++j) {
        printf("%d %d ", op[i].pos[j].first, op[i].pos[j].second);
      }
      printf("\n");
    }
  }
  return 0;
}
