#include <bits/stdc++.h>   using namespace std;   long long i, i1, j, k, k1, t, n, m, res, flag[10], a, b, mt[110][110], s;   char c;   vector<array<long long, 6>> sl;   vector<array<long long, 3>> cl;   void mv(long long a, long long b, long long c, long long d, long long e,           long long f) {     sl.push_back({a, b, c, d, e, f});     mt[a][b] ^= 1;     mt[c][d] ^= 1;     mt[e][f] ^= 1;   }   void cl4(vector<long long> st) {     long long i, l, x, s = 0;     for (i = 1; i <= 4; i++) s += st[i];     if (s == 0) return;     if (s == 3) {       l = 0;       cl.push_back({0, 0, 0});       x = cl.size();       x--;       for (i = 1; i <= 4; i++) {         if (st[i] == 1) {           st[i] ^= 1;           cl[x][l] = i;           l++;         }       }     }     if (s == 2) {       flag[1] = 0;       l = 0;       cl.push_back({0, 0, 0});       x = cl.size();       x--;       for (i = 1; i <= 4; i++) {         if (st[i] == 0 || (st[i] == 1 && flag[1] == 0)) {           st[i] ^= 1;           cl[x][l] = i;           l++;           if (st[i] == 0) flag[1] = 1;         }       }       cl4(st);     }     if (s == 1) {       flag[0] = 0;       l = 0;       cl.push_back({0, 0, 0});       x = cl.size();       x--;       for (i = 1; i <= 4; i++) {         if (st[i] == 1 || (st[i] == 0 && flag[0] < 2)) {           st[i] ^= 1;           cl[x][l] = i;           l++;           if (st[i] == 1) flag[0]++;         }       }       cl4(st);     }     if (s == 4) {       flag[1] = 0;       l = 0;       cl.push_back({0, 0, 0});       x = cl.size();       x--;       for (i = 1; i <= 4; i++) {         if (st[i] == 0 || (st[i] == 1 && flag[1] < 3)) {           st[i] ^= 1;           cl[x][l] = i;           l++;           if (st[i] == 0) flag[1]++;         }       }       cl4(st);     }   }   void init(vector<long long> st) {     cl.clear();     cl4(st);   }   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     cin >> t;     while (t--) {       cin >> n >> m;       sl.clear();       for (i = 1; i <= n; i++) {         for (j = 1; j <= m; j++) {           cin >> c;           if (c ==  0 )             mt[i][j] = 0;           else             mt[i][j] = 1;         }       }       for (i = 1; i <= n - 2; i++) {         for (j = 1; j <= m - 1; j++) {           if (mt[i][j] == 1 && mt[i][j + 1] == 1) {             mv(i, j, i, j + 1, i + 1, j);           } else if (mt[i][j] == 1 && mt[i][j + 1] == 0) {             mv(i, j, i + 1, j, i + 1, j + 1);           } else if (mt[i][j] == 0 && mt[i][j + 1] == 1) {             mv(i, j + 1, i + 1, j, i + 1, j + 1);           }         }       }       if (m % 2) {         if (mt[n - 1][m] == 1 && mt[n][m] == 1) {           mv(n - 1, m, n, m - 1, n, m);         } else if (mt[n - 1][m] == 1 && mt[n][m] == 0) {           mv(n - 1, m - 1, n - 1, m, n, m - 1);         } else if (mt[n - 1][m] == 0 && mt[n][m] == 1) {           mv(n - 1, m - 1, n, m - 1, n, m);         }       }       for (j = 1; j <= m - 1; j += 2) {         vector<long long> st;         vector<array<long long, 2>> fn;         st.push_back(0);         st.push_back(mt[n - 1][j]);         st.push_back(mt[n - 1][j + 1]);         st.push_back(mt[n][j]);         st.push_back(mt[n][j + 1]);         init(st);         for (auto u : cl) {           fn.clear();           for (i = 0; i < 3; i++) {             if (u[i] == 1)               fn.push_back({n - 1, j});             else if (u[i] == 2)               fn.push_back({n - 1, j + 1});             else if (u[i] == 3)               fn.push_back({n, j});             else if (u[i] == 4)               fn.push_back({n, j + 1});           }           sl.push_back({0, 0, 0, 0, 0, 0});           for (i = 0; i < 3; i++) {             s = sl.size();             s--;             sl[s][2 * i] = fn[i][0];             sl[s][2 * i + 1] = fn[i][1];           }         }       }       s = sl.size();       cout << s <<   n ;       for (auto u : sl) {         for (i = 0; i < 6; i++) cout << u[i] <<    ;         cout <<   n ;       }     }     return 0;   }