func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize(4)   using namespace std;   char _buf[100000], *_p1 = _buf, *_p2 = _buf;   inline int gi() {     int x = 0, f = 1;     char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) {       x = (x << 3) + (x << 1) + (ch ^ 48);       ch = getchar();     }     return (f == 1) ? x : -x;   }   inline int max(int a, int b) { return a > b ? a : b; }   inline int min(int a, int b) { return a < b ? a : b; }   int T, n, m;   struct node {     int x[3], y[3];     node(int a1, int b1, int a2, int b2, int a3, int b3) {       x[0] = a1, x[1] = a2, x[2] = a3;       y[0] = b1, y[1] = b2, y[2] = b3;     }     inline void output() {       for (int i = 0; i <= 2; ++i) printf( %d %d  , x[i], y[i]);     }   };   const int maxn = 105;   vector<node> vec;   int a[maxn][maxn];   char s[maxn];   inline void init() {     memset(a, 0, sizeof(a));     vec.clear();   }   inline void input() {     n = gi(), m = gi();     for (int i = 1; i <= n; ++i) {       scanf( %s , s + 1);       for (int j = 1; j <= m; ++j) a[i][j] = s[j] -  0 ;     }   }   inline void change(int a1, int b1, int a2, int b2, int a3, int b3) {     vec.push_back(node(a1, b1, a2, b2, a3, b3));     a[a1][b1] ^= 1, a[a2][b2] ^= 1, a[a3][b3] ^= 1;   }   inline void solve() {     for (int i = 1; i <= n - 2; ++i) {       for (int j = 1; j <= m - 1; ++j) {         if (a[i][j] == 0 && a[i][j + 1] == 0)           continue;         else {           if (a[i][j] == 0) {             change(i, j + 1, i + 1, j, i + 1, j + 1);           } else if (a[i][j + 1] == 1) {             change(i, j, i, j + 1, i + 1, j);           } else {             change(i, j, i + 1, j, i + 1, j + 1);           }         }       }     }     for (int i = 1; i <= m - 1; ++i) {       if (a[n - 1][i] == 1 && a[n][i] == 1) {         change(n - 1, i, n, i, n - 1, i + 1);       } else if (a[n - 1][i] == 1) {         change(n - 1, i, n, i + 1, n - 1, i + 1);       } else if (a[n][i] == 1) {         change(n, i, n - 1, i + 1, n, i + 1);       }     }     if (a[n][m] == 1 && a[n - 1][m] == 1) {       change(n - 1, m - 1, n - 1, m, n, m - 1);       change(n - 1, m - 1, n, m - 1, n, m);     } else if (a[n - 1][m] == 1) {       change(n - 1, m, n - 1, m - 1, n, m - 1);       change(n - 1, m - 1, n, m, n - 1, m);       change(n, m - 1, n, m, n - 1, m);     } else if (a[n][m] == 1) {       change(n, m, n - 1, m - 1, n, m - 1);       change(n - 1, m - 1, n, m, n - 1, m);       change(n, m - 1, n, m, n - 1, m);     }     printf( %d n , (int)(vec.size()));     for (auto x : vec) {       x.output();       printf(  n );     }   }   int main() {     T = gi();     while (T--) {       init();       input();       solve();     }     return 0;   }   