#include <bits/stdc++.h>   using namespace std;   vector<vector<int>> v;   int res;   int countOne(vector<vector<int>> &a, int i, int j) {     int res = 0;     if (a[i][j] == 1) res++;     if (a[i + 1][j] == 1) res++;     if (a[i][j + 1] == 1) res++;     if (a[i + 1][j + 1] == 1) res++;     return res;   }   void switchZeroOne(vector<vector<int>> &a, int i, int j) {     int cnt = countOne(a, i, j);     while (cnt != 0) {       if (cnt == 4) {         v[res].push_back(i);         v[res].push_back(j);         v[res].push_back(i);         v[res].push_back(j + 1);         v[res].push_back(i + 1);         v[res].push_back(j);         res++;         a[i][j] = 0;         a[i][j + 1] = 0;         a[i + 1][j] = 0;         cnt = 1;       } else if (cnt == 1) {         int switchZero = 0;         for (int x = i; x < i + 2; x++) {           for (int y = j; y < j + 2; y++) {             if (a[x][y] == 1) {               a[x][y] = 0;               v[res].push_back(x);               v[res].push_back(y);             } else if (switchZero < 2) {               a[x][y] = 1;               v[res].push_back(x);               v[res].push_back(y);               switchZero++;             }           }         }         res++;         cnt = 2;       } else if (cnt == 2) {         int switchOne = 0;         for (int x = i; x < i + 2; x++) {           for (int y = j; y < j + 2; y++) {             if (a[x][y] == 0) {               a[x][y] = 1;               v[res].push_back(x);               v[res].push_back(y);             } else if (switchOne < 1) {               a[x][y] = 0;               v[res].push_back(x);               v[res].push_back(y);               switchOne++;             }           }         }         res++;         cnt = 3;       } else if (cnt == 3) {         for (int x = i; x < i + 2; x++) {           for (int y = j; y < j + 2; y++) {             if (a[x][y] == 1) {               a[x][y] = 0;               v[res].push_back(x);               v[res].push_back(y);             }           }         }         res++;         cnt = 0;       }     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     int t, n, m;     string s;     cin >> t;     while (t--) {       cin >> n >> m;       vector<vector<int>> a(n + 1, vector<int>(m + 1));       for (int i = 1; i <= n; i++) {         cin >> s;         for (int j = 1; j <= m; j++) {           a[i][j] = s[j - 1] -  0 ;         }       }       v = vector<vector<int>>(50000);       res = 0;       if (n > 2) {         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) {               v[res].push_back(i);               v[res].push_back(j);               v[res].push_back(i);               v[res].push_back(j + 1);               v[res].push_back(i + 1);               v[res].push_back(j);               res++;               a[i][j] = 0;               a[i][j + 1] = 0;               a[i + 1][j] ^= 1;             } else if (a[i][j] == 1) {               v[res].push_back(i);               v[res].push_back(j);               v[res].push_back(i + 1);               v[res].push_back(j);               v[res].push_back(i + 1);               v[res].push_back(j + 1);               res++;               a[i][j] = 0;               a[i + 1][j] ^= 1;               a[i + 1][j + 1] ^= 1;             } else if (a[i][j + 1] == 1) {               v[res].push_back(i);               v[res].push_back(j + 1);               v[res].push_back(i + 1);               v[res].push_back(j);               v[res].push_back(i + 1);               v[res].push_back(j + 1);               res++;               a[i][j + 1] = 0;               a[i + 1][j] ^= 1;               a[i + 1][j + 1] ^= 1;             }           }         }         for (int j = 1; j <= m - 1; j += 2) {           switchZeroOne(a, n - 1, j);         }         if (m % 2 == 1) switchZeroOne(a, n - 1, m - 1);       } else {         for (int j = 1; j <= m - 2; j++) {           for (int i = 1; i <= n - 1; i++) {             if (a[i][j] == 1 && a[i + 1][j] == 1) {               v[res].push_back(i);               v[res].push_back(j);               v[res].push_back(i);               v[res].push_back(j + 1);               v[res].push_back(i + 1);               v[res].push_back(j);               res++;               a[i][j] = 0;               a[i][j + 1] ^= 1;               a[i + 1][j] = 0;             } else if (a[i][j] == 1) {               v[res].push_back(i);               v[res].push_back(j);               v[res].push_back(i);               v[res].push_back(j + 1);               v[res].push_back(i + 1);               v[res].push_back(j + 1);               res++;               a[i][j] = 0;               a[i][j + 1] ^= 1;               a[i + 1][j + 1] ^= 1;             } else if (a[i + 1][j] == 1) {               v[res].push_back(i);               v[res].push_back(j + 1);               v[res].push_back(i + 1);               v[res].push_back(j);               v[res].push_back(i + 1);               v[res].push_back(j + 1);               res++;               a[i][j + 1] ^= 1;               a[i + 1][j] = 0;               a[i + 1][j + 1] ^= 1;             }           }         }         for (int i = 1; i <= n - 1; i += 2) {           switchZeroOne(a, i, m - 1);         }         if (n % 2 == 1) switchZeroOne(a, n - 1, m - 1);       }       cout << res <<   n ;       for (int i = 0; i < res; i++) {         for (int j = 0; j < v[i].size(); j++) {           cout << v[i][j] <<    ;         }         cout <<   n ;       }     }     return 0;   }