#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(3, "Ofast", "inline")
struct ios {
  inline char read() {
    static const int IN_LEN = 1e6 + 10;
    static char buf[IN_LEN], *s, *t;
    return (s == t) && (t = (s = buf) + fread(buf, 1, IN_LEN, stdin)),
           s == t ? -1 : *s++;
  }
  template <typename _Tp>
  inline ios &operator>>(_Tp &x) {
    static char c11, boo;
    for (c11 = read(), boo = 0; !isdigit(c11); c11 = read()) {
      if (c11 == -1) return *this;
      boo |= c11 == '-';
    }
    for (x = 0; isdigit(c11); c11 = read()) x = x * 10 + (c11 ^ '0');
    boo && (x = -x);
    return *this;
  }
} io;
namespace IO {
template <typename T>
inline void w(T x) {
  if (x > 9) w(x / 10);
  putchar(x % 10 + 48);
}
template <typename T>
inline void write(T x, char c) {
  if (x < 0) putchar('-'), x = -x;
  w(x);
  putchar(c);
}
template <typename T>
inline void read(T &x) {
  x = 0;
  T f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -1;
  for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
  x *= f;
}
}  // namespace IO
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long qpow(long long a, long long b, long long p) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = ans * a % p;
    a = a * a % p;
    b >>= 1;
  }
  return ans;
}
void input() {
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
}
const int maxn = 100 + 10;
int a[maxn][maxn];
struct node {
  int t[6];
  node() {}
  node(int a, int b, int c, int d, int e, int f) {
    t[0] = a, t[1] = b, t[2] = c, t[3] = d, t[4] = e, t[5] = f;
  }
};
vector<node> ans;
int n, m;
void three() {
  node temp;
  int cnt = 0;
  for (int i = n - 1; i <= n; i++)
    for (int j = m - 1; j <= m; j++)
      if (a[i][j]) temp.t[cnt++] = i, temp.t[cnt++] = j;
  ans.push_back(temp);
}
void two() {
  node temp;
  int cnt = 0;
  for (int i = n - 1; i <= n; i++)
    for (int j = m - 1; j <= m; j++)
      if (!a[i][j]) temp.t[cnt++] = i, temp.t[cnt++] = j;
  for (int i = n - 1; i <= n; i++)
    for (int j = m - 1; j <= m; j++)
      if (a[i][j]) {
        temp.t[cnt++] = i, temp.t[cnt++] = j;
        break;
      }
  ans.push_back(temp);
  for (int i = 0; i < 6; i += 2) a[temp.t[i]][temp.t[i + 1]] ^= 1;
  three();
}
void one() {
  node temp;
  int cnt = 0;
  for (int i = n - 1; i <= n; i++)
    for (int j = m - 1; j <= m; j++)
      if (a[i][j]) temp.t[cnt++] = i, temp.t[cnt++] = j;
  for (int i = n - 1; i <= n; i++)
    for (int j = m - 1; j <= m; j++) {
      if (!a[i][j] && cnt <= 4) temp.t[cnt++] = i, temp.t[cnt++] = j;
    }
  ans.push_back(temp);
  for (int i = 0; i < 6; i += 2) a[temp.t[i]][temp.t[i + 1]] ^= 1;
  two();
}
void four() {
  node temp;
  int cnt = 0;
  for (int i = n - 1; i <= n; i++)
    for (int j = m - 1; j <= m; j++) {
      if (a[i][j] && cnt <= 4) temp.t[cnt++] = i, temp.t[cnt++] = j;
    }
  ans.push_back(temp);
  for (int i = 0; i < 6; i += 2) a[temp.t[i]][temp.t[i + 1]] ^= 1;
  one();
}
char s[maxn];
int main() {
  int T;
  cin >> T;
  while (T--) {
    ans.clear();
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
      scanf("%s", s + 1);
      for (int j = 1; j <= m; j++) {
        if (s[j] == '1')
          a[i][j] = 1;
        else
          a[i][j] = 0;
      }
    }
    for (int i = 1; i <= n - 2; i++)
      for (int j = 1; j <= m; j++) {
        if (a[i][j] == 1) {
          if (j == m) {
            ans.push_back({i, j, i + 1, j - 1, i + 1, j});
            a[i][j] ^= 1;
            a[i + 1][j - 1] ^= 1;
            a[i + 1][j] ^= 1;
          } else {
            if (a[i][j + 1] == 1) {
              node temp({i, j, i, j + 1, 0, 0});
              a[i][j] = 0;
              a[i][j + 1] = 0;
              if (a[i + 1][j] == 1)
                temp.t[4] = i + 1, temp.t[5] = j, a[i + 1][j] ^= 1;
              else
                temp.t[4] = i + 1, temp.t[5] = j + 1, a[i + 1][j + 1] ^= 1;
              ans.push_back(temp);
            } else {
              a[i][j] = 0;
              a[i + 1][j] ^= 1;
              a[i + 1][j + 1] ^= 1;
              ans.push_back({i, j, i + 1, j, i + 1, j + 1});
            }
          }
        }
      }
    for (int j = 1; j <= m - 2; j++) {
      if (a[n - 1][j] || a[n][j]) {
        if (a[n - 1][j] && a[n][j]) {
          node temp({0, 0, 0, 0, 0, 0});
          temp.t[0] = n - 1, temp.t[1] = j;
          temp.t[2] = n, temp.t[3] = j;
          a[n - 1][j] = a[n][j] = 0;
          if (a[n - 1][j + 1])
            temp.t[4] = n - 1, temp.t[5] = j + 1, a[n - 1][j + 1] ^= 1;
          else
            temp.t[4] = n, temp.t[5] = j + 1, a[n][j + 1] ^= 1;
          ans.push_back(temp);
        } else {
          if (a[n - 1][j]) {
            ans.push_back({n - 1, j, n - 1, j + 1, n, j + 1});
            a[n - 1][j] = 0;
            a[n - 1][j + 1] ^= 1;
            a[n][j + 1] ^= 1;
          } else {
            ans.push_back({n, j, n - 1, j + 1, n, j + 1});
            a[n][j] = 0;
            a[n - 1][j + 1] ^= 1;
            a[n][j + 1] ^= 1;
          }
        }
      }
    }
    int cnt = 0;
    for (int i = n - 1; i <= n; i++)
      for (int j = m - 1; j <= m; j++)
        if (a[i][j]) cnt++;
    switch (cnt) {
      case 1:
        one();
        break;
      case 2:
        two();
        break;
      case 3:
        three();
        break;
      case 4:
        four();
        break;
    }
    cout << ans.size() << endl;
    for (auto it : ans) {
      for (int i = 0; i < 5; i++) printf("%d ", it.t[i]);
      printf("%d\n", it.t[5]);
    }
  }
}
