#include <bits/stdc++.h>   using namespace std;   const int N = 110, size = 1 << 20, mod = 998244353, inf = 2e9;   const long long INF = 1e15;   template <class o>   void qr(o& x) {     char c = getchar();     x = 0;     int f = 1;     while (!isdigit(c)) {       if (c ==  - ) f = -1;       c = getchar();     }     while (isdigit(c)) x = x * 10 + c -  0 , c = getchar();     x *= f;   }   template <class o>   void qw(o x) {     if (x / 10) qw(x / 10);     putchar(x % 10 +  0 );   }   template <class o>   void pr1(o x) {     if (x < 0) x = -x, putchar( - );     qw(x);     putchar(   );   }   template <class o>   void pr2(o x) {     if (x < 0) x = -x, putchar( - );     qw(x);     putchar(  n );   }   long long gcd(long long a, long long b) { return !a ? b : gcd(b % a, a); }   long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }   long long power(long long a, long long b = mod - 2, long long p = mod) {     long long c = 1;     while (b) {       if (b & 1) c = c * a % p;       b /= 2;       a = a * a % p;     }     return c;   }   template <class o>   void cmax(o& x, o y) {     if (x < y) x = y;   }   template <class o>   void cmin(o& x, o y) {     if (x > y) x = y;   }   template <typename t1, typename t2>   void ad(t1& x, t2 y) {     x += y;     if (x >= mod) x -= mod;   }   template <typename t1, typename t2>   void dl(t1& x, t2 y) {     x -= y;     if (x < 0) x += mod;   }   template <typename T>   struct BIT {     T* c;     int n;     BIT(int _n) : n(_n) {       c = new T[n];       c--;       for (int i = 1; i <= n; i++) c[i] = T(0);     }     void add(int x, T y) {       for (; x <= n; x += x & -x) c[x] = c[x] + y;     }     T sum(int x) {       T y = T(0);       for (; x; x &= x - 1) y = y + c[x];       return y;     }   };   long long jc[N], inv[N];   void jc_init(int n) {     jc[0] = 1;     for (int i = 1; i <= n; i++) jc[i] = jc[i - 1] * i % mod;     inv[n] = power(jc[n]);     for (int i = n; i; i--) inv[i - 1] = inv[i] * i % mod;   }   long long C(int x, int y) {     if (x < y || y < 0) return 0;     return jc[x] * inv[y] % mod * inv[x - y] % mod;   }   int n, m;   char s[N][N];   void solve() {     qr(n);     qr(m);     vector<vector<pair<int, int> > > v;     for (int i = 1; i <= n; i++) scanf( %s , s[i] + 1);     for (int i = 1; i <= n - 2; i++)       for (int j = 1; j <= m; j++)         if (s[i][j] ==  1 ) {           s[i][j] ^= 1;           vector<pair<int, int> > o;           o.push_back(make_pair(i, j));           o.push_back(make_pair(i + 1, j));           s[i + 1][j] ^= 1;           if (j < m)             o.push_back(make_pair(i + 1, j + 1)), s[i + 1][j + 1] ^= 1;           else             o.push_back(make_pair(i + 1, j - 1)), s[i + 1][j - 1] ^= 1;           v.push_back(o);           assert(((int)o.size()) == 3);         }     for (int j = 1; j <= m - 2; j++) {       vector<pair<int, int> > o;       if (s[n][j] ==  1 ) o.push_back(make_pair(n, j)), s[n][j] =  0 ;       if (s[n - 1][j] ==  1 ) o.push_back(make_pair(n - 1, j)), s[n - 1][j] =  0 ;       if (((int)o.size())) {         o.push_back(make_pair(n, j + 1));         s[n][j + 1] ^= 1;         if (((int)o.size()) < 3)           o.push_back(make_pair(n - 1, j + 1)), s[n - 1][j + 1] ^= 1;         v.push_back(o);       }     }     vector<pair<int, int> > o;     char &x = s[n - 1][m - 1], &y = s[n - 1][m], &u = s[n][m - 1], &vv = s[n][m];     if (x ==  1 ) o.push_back(make_pair(n - 1, m - 1)), x =  0 ;     if (y ==  1 ) o.push_back(make_pair(n - 1, m)), y =  0 ;     if (((int)o.size())) {       for (int j = m - 1; j <= m; j++)         if (((int)o.size()) < 3) o.push_back(make_pair(n, j)), s[n][j] ^= 1;       v.push_back(o);     }     o.clear();     if (u ==  1  && vv ==  1 ) {       o.push_back(make_pair(n - 1, m - 1));       o.push_back(make_pair(n - 1, m));       o.push_back(make_pair(n, m));       v.push_back(o);       o[2] = make_pair(n, m - 1);       v.push_back(o);     } else if (u ==  1 ) {       o.push_back(make_pair(n, m - 1));       o.push_back(make_pair(n - 1, m));       o.push_back(make_pair(n, m));       v.push_back(o);       o[0] = make_pair(n - 1, m - 1);       o[1] = make_pair(n, m - 1);       o[2] = make_pair(n - 1, m);       v.push_back(o);       o[2] = make_pair(n, m);       v.push_back(o);     } else if (vv ==  1 ) {       o.push_back(make_pair(n, m));       o.push_back(make_pair(n - 1, m - 1));       o.push_back(make_pair(n, m - 1));       v.push_back(o);       o.clear();       o.push_back(make_pair(n - 1, m - 1));       o.push_back(make_pair(n - 1, m));       o.push_back(make_pair(n, m));       v.push_back(o);       o[0] = make_pair(n, m - 1);       v.push_back(o);     }     pr2(((int)v.size()));     for (auto i : v) {       for (auto j : i) pr1(j.first), pr1(j.second);       puts(  );     }   }   int main() {     int T = 1;     qr(T);     while (T--) solve();     return 0;   }