#include <bits/stdc++.h>   using namespace std;   void __print(int x) { cerr << x; }   void __print(long x) { cerr << x; }   void __print(long long x) { cerr << x; }   void __print(unsigned x) { cerr << x; }   void __print(unsigned long x) { cerr << x; }   void __print(unsigned long long x) { cerr << x; }   void __print(float x) { cerr << x; }   void __print(double x) { cerr << x; }   void __print(long double x) { cerr << x; }   void __print(char x) { cerr <<      << x <<     ; }   void __print(const char *x) { cerr <<     << x <<    ; }   void __print(const string &x) { cerr <<     << x <<    ; }   void __print(bool x) { cerr << (x ?  true  :  false ); }   template <typename T, typename V>   void __print(const pair<T, V> &x) {     cerr <<  { ;     __print(x.first);     cerr <<  , ;     __print(x.second);     cerr <<  } ;   }   template <typename T>   void __print(const T &x) {     int f = 0;     cerr <<  { ;     for (auto &i : x) cerr << (f++ ?  ,  :   ), __print(i);     cerr <<  } ;   }   void _print() { cerr <<  ] n ; }   template <typename T, typename... V>   void _print(T t, V... v) {     __print(t);     if (sizeof...(v)) cerr <<  ,  ;     _print(v...);   }   template <typename T>   void printVec(const T &v, char sep =    ) {     for (auto &i : v) cout << i << sep;   }   template <typename T>   void printVecPair(const T &v, char sep =    ) {     for (auto &i : v) cout << i.first <<     << i.second << sep;   }   struct Points {     int x1, y1, x2, y2, x3, y3;   };   void solve() {     int n, m;     cin >> n >> m;     vector<string> g(n);     for (int i = 0; i < n; i++) {       cin >> g[i];     }     vector<Points> ans;     for (int i = 0; i < n - 1; i++) {       for (int j = 0; j < m - 1; j++) {         if (g[i][j] ==  1 ) {           g[i][j] =  0 ;           ans.push_back({i, j, i, j + 1, i + 1, j});           g[i][j + 1] = (g[i][j + 1] ==  1  ?  0  :  1 );           g[i + 1][j] = (g[i + 1][j] ==  1  ?  0  :  1 );         }       }     }     for (int i = 0; i < n - 1; i += 2) {       int cntOne = 0;       cntOne += (g[i][m - 1] ==  1 );       cntOne += (g[i + 1][m - 1] ==  1 );       if (cntOne == 1) {         if (g[i][m - 1] ==  1 ) {           ans.push_back({i, m - 1, i, m - 2, i + 1, m - 2});           ans.push_back({i, m - 1, i + 1, m - 1, i + 1, m - 2});           ans.push_back({i, m - 1, i, m - 2, i + 1, m - 1});           for (int i = ans.size() - 3; i < ans.size(); i++) {             g[ans[i].x1][ans[i].y1] =                 (g[ans[i].x1][ans[i].y1] ==  1  ?  0  :  1 );             g[ans[i].x2][ans[i].y2] =                 (g[ans[i].x2][ans[i].y2] ==  1  ?  0  :  1 );             g[ans[i].x3][ans[i].y3] =                 (g[ans[i].x3][ans[i].y3] ==  1  ?  0  :  1 );           }         } else {           ans.push_back({i, m - 2, i, m - 1, i + 1, m - 1});           ans.push_back({i, m - 1, i + 1, m - 1, i + 1, m - 2});           ans.push_back({i, m - 2, i + 1, m - 1, i + 1, m - 2});           for (int i = ans.size() - 3; i < ans.size(); i++) {             g[ans[i].x1][ans[i].y1] =                 (g[ans[i].x1][ans[i].y1] ==  1  ?  0  :  1 );             g[ans[i].x2][ans[i].y2] =                 (g[ans[i].x2][ans[i].y2] ==  1  ?  0  :  1 );             g[ans[i].x3][ans[i].y3] =                 (g[ans[i].x3][ans[i].y3] ==  1  ?  0  :  1 );           }         }       } else if (cntOne == 2) {         ans.push_back({i, m - 2, i + 1, m - 2, i + 1, m - 1});         ans.push_back({i, m - 2, i, m - 1, i + 1, m - 2});         for (int i = ans.size() - 2; i < ans.size(); i++) {           g[ans[i].x1][ans[i].y1] = (g[ans[i].x1][ans[i].y1] ==  1  ?  0  :  1 );           g[ans[i].x2][ans[i].y2] = (g[ans[i].x2][ans[i].y2] ==  1  ?  0  :  1 );           g[ans[i].x3][ans[i].y3] = (g[ans[i].x3][ans[i].y3] ==  1  ?  0  :  1 );         }       }     }     for (int i = 0; i < m - 1; i += 2) {       int cntOne = 0;       cntOne += (g[n - 1][i] ==  1 );       cntOne += (g[n - 1][i + 1] ==  1 );       if (cntOne == 1) {         if (g[n - 1][i] ==  1 ) {           ans.push_back({n - 2, i, n - 1, i, n - 2, i + 1});           ans.push_back({n - 2, i, n - 1, i, n - 1, i + 1});           ans.push_back({n - 2, i + 1, n - 1, i + 1, n - 1, i});           for (int i = ans.size() - 3; i < ans.size(); i++) {             g[ans[i].x1][ans[i].y1] =                 (g[ans[i].x1][ans[i].y1] ==  1  ?  0  :  1 );             g[ans[i].x2][ans[i].y2] =                 (g[ans[i].x2][ans[i].y2] ==  1  ?  0  :  1 );             g[ans[i].x3][ans[i].y3] =                 (g[ans[i].x3][ans[i].y3] ==  1  ?  0  :  1 );           }         } else {           ans.push_back({n - 2, i, n - 2, i + 1, n - 1, i + 1});           ans.push_back({n - 2, i, n - 1, i, n - 1, i + 1});           ans.push_back({n - 2, i + 1, n - 1, i + 1, n - 1, i});           for (int i = ans.size() - 3; i < ans.size(); i++) {             g[ans[i].x1][ans[i].y1] =                 (g[ans[i].x1][ans[i].y1] ==  1  ?  0  :  1 );             g[ans[i].x2][ans[i].y2] =                 (g[ans[i].x2][ans[i].y2] ==  1  ?  0  :  1 );             g[ans[i].x3][ans[i].y3] =                 (g[ans[i].x3][ans[i].y3] ==  1  ?  0  :  1 );           }         }       } else if (cntOne == 2) {         ans.push_back({n - 2, i, n - 2, i + 1, n - 1, i});         ans.push_back({n - 2, i, n - 2, i + 1, n - 1, i + 1});         for (int i = ans.size() - 2; i < ans.size(); i++) {           g[ans[i].x1][ans[i].y1] = (g[ans[i].x1][ans[i].y1] ==  1  ?  0  :  1 );           g[ans[i].x2][ans[i].y2] = (g[ans[i].x2][ans[i].y2] ==  1  ?  0  :  1 );           g[ans[i].x3][ans[i].y3] = (g[ans[i].x3][ans[i].y3] ==  1  ?  0  :  1 );         }       }     }     if (g[n - 1][m - 1] ==  1 ) {       ans.push_back({n - 2, m - 2, n - 2, m - 1, n - 1, m - 1});       ans.push_back({n - 2, m - 2, n - 1, m - 2, n - 1, m - 1});       ans.push_back({n - 2, m - 1, n - 1, m - 2, n - 1, m - 1});       for (int i = ans.size() - 3; i < ans.size(); i++) {         g[ans[i].x1][ans[i].y1] = (g[ans[i].x1][ans[i].y1] ==  1  ?  0  :  1 );         g[ans[i].x2][ans[i].y2] = (g[ans[i].x2][ans[i].y2] ==  1  ?  0  :  1 );         g[ans[i].x3][ans[i].y3] = (g[ans[i].x3][ans[i].y3] ==  1  ?  0  :  1 );       }     }     cout << ans.size() << endl;     for (auto p : ans) {       cout << p.x1 + 1 <<     << p.y1 + 1 <<    ;       cout << p.x2 + 1 <<     << p.y2 + 1 <<    ;       cout << p.x3 + 1 <<     << p.y3 + 1 << endl;     }   }   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     int t;     cin >> t;     while (t--) solve();     return 0;   }