#include <bits/stdc++.h>
const long long mod = (long long)1e9 + 7;
using namespace std;
long long calc(long long i1, long long i2, const vector<string> &vc) {
  long long c = (vc[i1][i2] - '0') + (vc[i1 + 1][i2] - '0') +
                (vc[i1][i2 + 1] - '0') + (vc[i1 + 1][i2 + 1] - '0');
  return c;
}
vector<long long> getfour(long long i1, long long i2, vector<string> &vc) {
  vector<long long> arr;
  arr.push_back(i1);
  arr.push_back(i2);
  arr.push_back(i1 + 1);
  arr.push_back(i2);
  arr.push_back(i1);
  arr.push_back(i2 + 1);
  vc[i1][i2] = vc[i1 + 1][i2] = vc[i1][i2 + 1] = '0';
  return arr;
}
vector<long long> getone(long long i1, long long i2, vector<string> &vc) {
  vector<long long> arr1, arr2;
  for (long long ii1 = i1; ii1 <= i1 + 1; ii1++) {
    for (long long ii2 = i2; ii2 <= i2 + 1; ii2++) {
      if (vc[ii1][ii2] == '1') {
        arr2.push_back(ii1);
        arr2.push_back(ii2);
        vc[ii1][ii2] = '0';
      } else if ((long long)arr1.size() < 4) {
        arr1.push_back(ii1);
        arr1.push_back(ii2);
        vc[ii1][ii2] = '1';
      }
    }
  }
  vector<long long> arr;
  for (auto i : arr1) arr.push_back(i);
  for (auto i : arr2) arr.push_back(i);
  return arr;
}
vector<long long> gettwo(long long i1, long long i2, vector<string> &vc) {
  vector<long long> arr1, arr2;
  for (long long ii1 = i1; ii1 <= i1 + 1; ii1++) {
    for (long long ii2 = i2; ii2 <= i2 + 1; ii2++) {
      if (vc[ii1][ii2] == '1' and (long long) arr2.size() == 0) {
        arr2.push_back(ii1);
        arr2.push_back(ii2);
        vc[ii1][ii2] = '0';
      } else if (vc[ii1][ii2] == '0' and (long long) arr1.size() < 4) {
        arr1.push_back(ii1);
        arr1.push_back(ii2);
        vc[ii1][ii2] = '1';
      }
    }
  }
  vector<long long> arr;
  for (auto i : arr1) arr.push_back(i);
  for (auto i : arr2) arr.push_back(i);
  return arr;
}
vector<long long> getthree(long long i1, long long i2, vector<string> &vc) {
  vector<long long> arr;
  for (long long ii1 = i1; ii1 <= i1 + 1; ii1++) {
    for (long long ii2 = i2; ii2 <= i2 + 1; ii2++) {
      if (vc[ii1][ii2] == '1') {
        arr.push_back(ii1);
        arr.push_back(ii2);
        vc[ii1][ii2] = '0';
      }
    }
  }
  return arr;
}
vector<vector<long long>> getAns(long long n, long long m, vector<string> &vc) {
  vector<vector<long long>> ans;
  for (long long i = 0; i < n - 1; i++) {
    for (long long j = 0; j < m - 2; j++) {
      if (vc[i][j] == '0' and vc[i + 1][j] == '0') continue;
      if (vc[i][j] == '1' and vc[i + 1][j] == '1') {
        vector<long long> temp;
        temp.push_back(i);
        temp.push_back(j);
        temp.push_back(i + 1);
        temp.push_back(j);
        temp.push_back(i);
        temp.push_back(j + 1);
        vc[i][j] = vc[i + 1][j] = '0';
        vc[i][j + 1] == '0' ? vc[i][j + 1] = '1' : vc[i][j + 1] = '0';
        ans.push_back(temp);
      } else if (vc[i][j] == '1' and vc[i + 1][j] == '0') {
        vector<long long> temp;
        temp.push_back(i);
        temp.push_back(j);
        temp.push_back(i);
        temp.push_back(j + 1);
        temp.push_back(i + 1);
        temp.push_back(j + 1);
        vc[i][j] = '0';
        vc[i][j + 1] == '0' ? vc[i][j + 1] = '1' : vc[i][j + 1] = '0';
        vc[i + 1][j + 1] == '0' ? vc[i + 1][j + 1] = '1'
                                : vc[i + 1][j + 1] = '0';
        ans.push_back(temp);
      } else if (vc[i][j] == '0' and vc[i + 1][j] == '1') {
        vector<long long> temp;
        temp.push_back(i + 1);
        temp.push_back(j);
        temp.push_back(i);
        temp.push_back(j + 1);
        temp.push_back(i + 1);
        temp.push_back(j + 1);
        vc[i + 1][j] = '0';
        vc[i][j + 1] == '0' ? vc[i][j + 1] = '1' : vc[i][j + 1] = '0';
        vc[i + 1][j + 1] == '0' ? vc[i + 1][j + 1] = '1'
                                : vc[i + 1][j + 1] = '0';
        ans.push_back(temp);
      }
    }
  }
  for (long long i = 0; i < n - 1; i++) {
    long long j = m - 2;
    while (calc(i, j, vc) != 0) {
      long long c = calc(i, j, vc);
      if (c == 4) {
        ans.push_back(getfour(i, j, vc));
      } else if (c == 3) {
        ans.push_back(getthree(i, j, vc));
      } else if (c == 2) {
        ans.push_back(gettwo(i, j, vc));
      } else {
        ans.push_back(getone(i, j, vc));
      }
    }
  }
  return ans;
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long t;
  cin >> t;
  while (t--) {
    long long n, m;
    cin >> n >> m;
    vector<string> vc(n);
    for (long long i = 0; i < n; i++) {
      cin >> vc[i];
    }
    if (n > m) {
      string s;
      for (long long i = 0; i < n; i++) s.push_back('0');
      vector<string> arr(m, s);
      for (long long i = 0; i < n; i++) {
        for (long long j = 0; j < m; j++) {
          arr[m - 1 - j][i] = vc[i][j];
        }
      }
      vector<vector<long long>> ans = getAns(m, n, arr);
      vector<vector<long long>> ans2((long long)ans.size(),
                                     vector<long long>(6, 0));
      for (long long i = 0; i < (long long)ans.size(); i++) {
        for (long long j = 0; j < (long long)ans[i].size(); j += 2) {
          long long I = ans[i][j], J = ans[i][j + 1];
          ans2[i][j] = J;
          ans2[i][j + 1] = m - 1 - I;
        }
      }
      cout << ans2.size() << "\n";
      for (long long i = 0; i < (long long)ans2.size(); i++) {
        for (auto it : ans2[i]) cout << it + 1 << ' ';
        cout << "\n";
      }
      continue;
    }
    vector<vector<long long>> ans = getAns(n, m, vc);
    cout << ans.size() << "\n";
    for (long long i = 0; i < (long long)ans.size(); i++) {
      for (auto it : ans[i]) {
        cout << it + 1 << ' ';
      }
      cout << "\n";
    }
  }
  return 0;
}
