#include <bits/stdc++.h>   using namespace std;   template <typename F, typename S>   ostream& operator<<(ostream& os, const pair<F, S>& p) {     return os <<  (  << p.first <<  ,   << p.second <<  ) ;   }   template <class T>   ostream& operator<<(ostream& os, vector<T> const& x) {     os <<  {  ;     for (auto& y : x) os << y <<    ;     return os <<  } ;   }   template <class T>   ostream& operator<<(ostream& os, set<T> const& x) {     os <<  {  ;     for (auto& y : x) os << y <<    ;     return os <<  } ;   }   template <typename T>   ostream& operator<<(ostream& os, const multiset<T>& v) {     os <<  [ ;     typename multiset<T>::const_iterator it;     for (it = v.begin(); it != v.end(); it++) {       if (it != v.begin()) os <<  ,  ;       os << *it;     }     return os <<  ] ;   }   template <typename F, typename S>   ostream& operator<<(ostream& os, const map<F, S>& v) {     os <<  [ ;     typename map<F, S>::const_iterator it;     for (it = v.begin(); it != v.end(); it++) {       if (it != v.begin()) os <<  ,  ;       os << it->first <<   =   << it->second;     }     return os <<  ] ;   }   string s[200];   vector<pair<int, int> > ans;   void cng(int x1, int y1, int x2, int y2, int x3, int y3) {     s[x1][y1] = s[x1][y1] ==  1  ?  0  :  1 ;     s[x2][y2] = s[x2][y2] ==  1  ?  0  :  1 ;     s[x3][y3] = s[x3][y3] ==  1  ?  0  :  1 ;     ans.push_back({x1, y1});     ans.push_back({x2, y2});     ans.push_back({x3, y3});   }   void _main_main() {     int n, m;     cin >> n >> m;     for (int i = 0; i < n; i++) cin >> s[i];     ans.clear();     for (int i = 0; i < n - 2; i++) {       for (int j = 0; j < m - 1; j++) {         if (s[i][j] ==  1 ) cng(i, j, i, j + 1, i + 1, j);       }       if (s[i][m - 1] ==  1 ) cng(i, m - 1, i + 1, m - 1, i + 1, m - 2);     }     for (int j = 0; j < m - 2; j++) {       if (s[n - 2][j] ==  1 ) cng(n - 2, j, n - 2, j + 1, n - 1, j + 1);       if (s[n - 1][j] ==  1 ) cng(n - 1, j, n - 2, j + 1, n - 1, j + 1);     }     int j = m - 2;     while (1) {       int cnt = 0;       if (s[n - 2][j] ==  1 ) cnt++;       if (s[n - 2][j + 1] ==  1 ) cnt++;       if (s[n - 1][j] ==  1 ) cnt++;       if (s[n - 1][j + 1] ==  1 ) cnt++;       if (cnt == 0)         break;       else if (cnt == 1) {         if (s[n - 2][j] ==  1 )           cng(n - 2, j, n - 2, j + 1, n - 1, j);         else if (s[n - 2][j + 1] ==  1 )           cng(n - 2, j, n - 2, j + 1, n - 1, j);         else if (s[n - 1][j] ==  1 )           cng(n - 2, j, n - 2, j + 1, n - 1, j);         else if (s[n - 1][j + 1] ==  1 )           cng(n - 1, j + 1, n - 2, j + 1, n - 1, j);       } else if (cnt == 2) {         if (s[n - 2][j] ==  1 )           cng(n - 1, j + 1, n - 2, j + 1, n - 1, j);         else if (s[n - 2][j + 1] ==  1 )           cng(n - 2, j, n - 1, j + 1, n - 1, j);         else if (s[n - 1][j] ==  1 )           cng(n - 2, j, n - 2, j + 1, n - 1, j + 1);         else if (s[n - 1][j + 1] ==  1 )           cng(n - 2, j, n - 2, j + 1, n - 1, j);       } else if (cnt == 3) {         if (s[n - 2][j] ==  0 )           cng(n - 1, j + 1, n - 2, j + 1, n - 1, j);         else if (s[n - 2][j + 1] ==  0 )           cng(n - 2, j, n - 1, j + 1, n - 1, j);         else if (s[n - 1][j] ==  0 )           cng(n - 2, j, n - 2, j + 1, n - 1, j + 1);         else if (s[n - 1][j + 1] ==  0 )           cng(n - 2, j, n - 2, j + 1, n - 1, j);       } else {         cng(n - 2, j, n - 2, j + 1, n - 1, j);       }     }     cout << ans.size() / 3 << endl;     int cnt = 0;     for (auto i : ans) {       cnt++;       cout << i.first + 1 <<     << i.second + 1 <<    ;       if (cnt == 3) {         cnt = 0;         cout << endl;       }     }   }   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     int testCase = 1;     cin >> testCase;     for (int i = 0; i < testCase; i++) {       _main_main();     }   }