#include <bits/stdc++.h>
using namespace std;
const long long Maxn = 3e6 + 10;
const long long Mod = 1e9 + 7;
char a[105][105];
int ans[Maxn];
long long n, m;
long long pos = 1;
void change(int i, int j) {
  if (a[i][j] == '1')
    a[i][j] = '0';
  else
    a[i][j] = '1';
  ans[pos++] = i, ans[pos++] = j;
}
void f1(int i1, int j1) {
  for (int i = n - 1; i <= n; i++) {
    for (int j = m - 1; j <= m; j++) {
      if (!(i == i1 && j == j1)) ans[pos++] = i, ans[pos++] = j;
    }
  }
}
void f2(int i1, int j1, int i2, int j2) {
  ans[pos++] = i1, ans[pos++] = j1;
  for (int i = n - 1; i <= n; i++) {
    for (int j = m - 1; j <= m; j++) {
      if (!((i == i1 && j == j1) || (i == i2 && j == j2)))
        ans[pos++] = i, ans[pos++] = j;
    }
  }
  f1(i1, j1);
}
void f3(int i, int j) {
  if (i == n) {
    ans[pos++] = n - 1, ans[pos++] = m;
    ans[pos++] = n - 1, ans[pos++] = m - 1;
    if (j == m) {
      ans[pos++] = n, ans[pos++] = m;
      f2(n - 1, m - 1, n - 1, m);
    } else {
      ans[pos++] = n, ans[pos++] = m - 1;
      f2(n - 1, m - 1, n - 1, m);
    }
  } else {
    ans[pos++] = n, ans[pos++] = m;
    ans[pos++] = n, ans[pos++] = m - 1;
    if (j == m) {
      ans[pos++] = n - 1, ans[pos++] = m;
      f2(n, m - 1, n, m);
    } else {
      ans[pos++] = n - 1, ans[pos++] = m - 1;
      f2(n, m - 1, n, m);
    }
  }
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) {
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%s", a[i] + 1);
    long long ans1 = 0;
    pos = 1;
    for (int i = 1; i <= n - 2; i++) {
      for (int j = 1; j <= m - 1; j++) {
        if (a[i][j] == '1' && a[i][j + 1] == '1') {
          change(i, j);
          change(i, j + 1);
          change(i + 1, j);
          ans1++;
        } else if (a[i][j] == '1' && a[i][j + 1] == '0') {
          change(i, j);
          change(i + 1, j + 1);
          change(i + 1, j);
          ans1++;
        } else if (a[i][j] == '0' && a[i][j + 1] == '1') {
          change(i, j + 1);
          change(i + 1, j + 1);
          change(i + 1, j);
          ans1++;
        }
      }
    }
    for (int i = n - 1, j = 1; j <= m - 2; j++) {
      if (a[i][j] == '1' && a[i + 1][j] == '1') {
        change(i, j);
        change(i + 1, j);
        change(i, j + 1);
        ans1++;
      } else if (a[i][j] == '1' && a[i + 1][j] == '0') {
        change(i, j);
        change(i + 1, j + 1);
        change(i, j + 1);
        ans1++;
      } else if (a[i][j] == '0' && a[i + 1][j] == '1') {
        change(i + 1, j);
        change(i + 1, j + 1);
        change(i, j + 1);
        ans1++;
      }
    }
    int num = 0;
    if (a[n][m] == '1') num++;
    if (a[n - 1][m] == '1') num++;
    if (a[n][m - 1] == '1') num++;
    if (a[n - 1][m - 1] == '1') num++;
    if (num == 4) {
      ans[pos++] = n, ans[pos++] = m, ans[pos++] = n - 1, ans[pos++] = m,
      ans[pos++] = n, ans[pos++] = m - 1;
      f3(n - 1, m - 1);
      ans1 += 4;
    } else if (num == 3) {
      int sign = 0;
      for (int i = n - 1; i <= n; i++) {
        for (int j = m - 1; j <= m; j++) {
          if (a[i][j] == '0') {
            sign = 1;
            f1(i, j);
            break;
          }
        }
        if (sign == 1) break;
      }
      ans1++;
    } else if (num == 2) {
      int id1 = -1, id2 = -1, id3 = -1, id4 = -1;
      for (int i = n - 1; i <= n; i++) {
        for (int j = m - 1; j <= m; j++) {
          if (a[i][j] == '1') {
            if (id1 == -1)
              id1 = i, id2 = j;
            else if (id3 == -1)
              id3 = i, id4 = j;
          }
        }
      }
      f2(id1, id2, id3, id4);
      ans1 += 2;
    } else if (num == 1) {
      int sign = 0;
      for (int i = n - 1; i <= n; i++) {
        for (int j = m - 1; j <= m; j++) {
          if (a[i][j] == '1') {
            sign = 1;
            f3(i, j);
            break;
          }
        }
        if (sign == 1) break;
      }
      ans1 += 3;
    }
    printf("%lld\n", ans1);
    for (int i = 1; i < pos; i++) {
      printf("%d ", ans[i]);
      if (i % 6 == 0) printf("\n");
    }
  }
}
