#include <bits/stdc++.h>
using namespace std;
const long long int M = 1e9 + 7;
long long int mod(long long int n) { return (n % M + M) % M; }
long long int modAdd(long long int a, long long int b) {
  return mod(mod(a) + mod(b));
}
long long int modMul(long long int a, long long int b) {
  return mod(mod(a) * mod(b));
}
long long int modMinus(long long int a, long long int b) {
  return mod(mod(a) - mod(b));
}
long long int modpow(long long int x, long long int n) {
  if (n == 0) return 1 % M;
  if (n == 1) return x % M;
  long long int u = modpow(x, n / 2);
  u = modMul(u, u);
  if (n % 2) u = modMul(u, x);
  return u;
}
long long int gcd(long long int a, long long int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
bool isPrime(long long int n) {
  int end = sqrt(n);
  for (int i = 2; i <= end; i++)
    if (n % i == 0) return false;
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int t = 1;
  cin >> t;
  while (t--) {
    int n, m;
    cin >> n >> m;
    vector<string> mat;
    string data;
    for (int i = 0; i < n; i++) {
      cin >> data;
      mat.push_back(data);
    }
    int rLimit = n - 2;
    int cLimit = m - 2;
    vector<vector<int>> ans;
    for (int i = 0; i < rLimit; i++) {
      for (int j = 0; j < cLimit; j++) {
        if (mat[i][j] != '0') {
          vector<int> tAns;
          int acI = i + 1;
          int acJ = j + 1;
          tAns.push_back(acI);
          tAns.push_back(acJ);
          tAns.push_back(acI);
          tAns.push_back(acJ + 1);
          tAns.push_back(acI + 1);
          tAns.push_back(acJ + 1);
          mat[i][j] = '0';
          if (mat[i][j + 1] == '0')
            mat[i][j + 1] = '1';
          else
            mat[i][j + 1] = '0';
          if (mat[i + 1][j + 1] == '0')
            mat[i + 1][j + 1] = '1';
          else
            mat[i + 1][j + 1] = '0';
          ans.push_back(tAns);
        }
      }
    }
    for (int i = 0; i < rLimit; i++) {
      vector<int> tAns;
      if (mat[i][cLimit] == '0' && mat[i][cLimit + 1] == '1') {
        int acI = i + 1;
        int acJ = cLimit + 1;
        tAns.push_back(acI);
        tAns.push_back(acJ + 1);
        tAns.push_back(acI + 1);
        tAns.push_back(acJ + 1);
        tAns.push_back(acI + 1);
        tAns.push_back(acJ);
        mat[i][cLimit + 1] = '0';
        if (mat[i + 1][cLimit + 1] == '0')
          mat[i + 1][cLimit + 1] = '1';
        else
          mat[i + 1][cLimit + 1] = '0';
        if (mat[i + 1][cLimit] == '0')
          mat[i + 1][cLimit] = '1';
        else
          mat[i + 1][cLimit] = '0';
        ans.push_back(tAns);
      } else if (mat[i][cLimit] == '1' && mat[i][cLimit + 1] == '0') {
        int acI = i + 1;
        int acJ = cLimit + 1;
        tAns.push_back(acI);
        tAns.push_back(acJ);
        tAns.push_back(acI + 1);
        tAns.push_back(acJ);
        tAns.push_back(acI + 1);
        tAns.push_back(acJ + 1);
        mat[i][cLimit] = '0';
        if (mat[i + 1][cLimit] == '0')
          mat[i + 1][cLimit] = '1';
        else
          mat[i + 1][cLimit] = '0';
        if (mat[i + 1][cLimit + 1] == '0')
          mat[i + 1][cLimit + 1] = '1';
        else
          mat[i + 1][cLimit + 1] = '0';
        ans.push_back(tAns);
      } else if (mat[i][cLimit] == '1' && mat[i][cLimit + 1] == '1') {
        int acI = i + 1;
        int acJ = cLimit + 1;
        tAns.push_back(acI);
        tAns.push_back(acJ);
        tAns.push_back(acI);
        tAns.push_back(acJ + 1);
        tAns.push_back(acI + 1);
        tAns.push_back(acJ + 1);
        mat[i][cLimit] = '0';
        mat[i][cLimit + 1] = '0';
        if (mat[i + 1][cLimit + 1] == '0')
          mat[i + 1][cLimit + 1] = '1';
        else
          mat[i + 1][cLimit + 1] = '0';
        ans.push_back(tAns);
      }
    }
    for (int i = 0; i < cLimit; i++) {
      if (mat[rLimit][i] == '0' && mat[rLimit + 1][i] == '1') {
        vector<int> tAns;
        int acI = rLimit + 1;
        int acJ = i + 1;
        tAns.push_back(acI + 1);
        tAns.push_back(acJ);
        tAns.push_back(acI + 1);
        tAns.push_back(acJ + 1);
        tAns.push_back(acI);
        tAns.push_back(acJ + 1);
        mat[rLimit + 1][i] = '0';
        if (mat[rLimit + 1][i + 1] == '0')
          mat[rLimit + 1][i + 1] = '1';
        else
          mat[rLimit + 1][i + 1] = '0';
        if (mat[rLimit][i + 1] == '0')
          mat[rLimit][i + 1] = '1';
        else
          mat[rLimit][i + 1] = '0';
        ans.push_back(tAns);
      } else if (mat[rLimit][i] == '1' && mat[rLimit + 1][i] == '0') {
        vector<int> tAns;
        int acI = rLimit + 1;
        int acJ = i + 1;
        tAns.push_back(acI);
        tAns.push_back(acJ);
        tAns.push_back(acI);
        tAns.push_back(acJ + 1);
        tAns.push_back(acI + 1);
        tAns.push_back(acJ + 1);
        mat[rLimit][i] = '0';
        if (mat[rLimit][i + 1] == '0')
          mat[rLimit][i + 1] = '1';
        else
          mat[rLimit][i + 1] = '0';
        if (mat[rLimit + 1][i + 1] == '0')
          mat[rLimit + 1][i + 1] = '1';
        else
          mat[rLimit + 1][i + 1] = '0';
        ans.push_back(tAns);
      } else if (mat[rLimit][i] == '1' && mat[rLimit + 1][i] == '1') {
        vector<int> tAns;
        int acI = rLimit + 1;
        int acJ = i + 1;
        tAns.push_back(acI);
        tAns.push_back(acJ);
        tAns.push_back(acI);
        tAns.push_back(acJ + 1);
        tAns.push_back(acI + 1);
        tAns.push_back(acJ);
        mat[rLimit][i] = '0';
        mat[rLimit + 1][i] = '0';
        if (mat[rLimit][i + 1] == '0')
          mat[rLimit][i + 1] = '1';
        else
          mat[rLimit][i + 1] = '0';
        ans.push_back(tAns);
      }
    }
    if (mat[rLimit][cLimit] == '0' && mat[rLimit][cLimit + 1] == '0' &&
        mat[rLimit + 1][cLimit] == '0' && mat[rLimit + 1][cLimit + 1] == '1') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '0' && mat[rLimit][cLimit + 1] == '0' &&
               mat[rLimit + 1][cLimit] == '1' &&
               mat[rLimit + 1][cLimit + 1] == '0') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '0' && mat[rLimit][cLimit + 1] == '0' &&
               mat[rLimit + 1][cLimit] == '1' &&
               mat[rLimit + 1][cLimit + 1] == '1') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '0' && mat[rLimit][cLimit + 1] == '1' &&
               mat[rLimit + 1][cLimit] == '0' &&
               mat[rLimit + 1][cLimit + 1] == '0') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '0' && mat[rLimit][cLimit + 1] == '1' &&
               mat[rLimit + 1][cLimit] == '0' &&
               mat[rLimit + 1][cLimit + 1] == '1') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '0' && mat[rLimit][cLimit + 1] == '1' &&
               mat[rLimit + 1][cLimit] == '1' &&
               mat[rLimit + 1][cLimit + 1] == '0') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '0' && mat[rLimit][cLimit + 1] == '1' &&
               mat[rLimit + 1][cLimit] == '1' &&
               mat[rLimit + 1][cLimit + 1] == '1') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '1' && mat[rLimit][cLimit + 1] == '0' &&
               mat[rLimit + 1][cLimit] == '0' &&
               mat[rLimit + 1][cLimit + 1] == '0') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '1' && mat[rLimit][cLimit + 1] == '0' &&
               mat[rLimit + 1][cLimit] == '0' &&
               mat[rLimit + 1][cLimit + 1] == '1') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '1' && mat[rLimit][cLimit + 1] == '0' &&
               mat[rLimit + 1][cLimit] == '1' &&
               mat[rLimit + 1][cLimit + 1] == '0') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '1' && mat[rLimit][cLimit + 1] == '0' &&
               mat[rLimit + 1][cLimit] == '1' &&
               mat[rLimit + 1][cLimit + 1] == '1') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '1' && mat[rLimit][cLimit + 1] == '1' &&
               mat[rLimit + 1][cLimit] == '0' &&
               mat[rLimit + 1][cLimit + 1] == '0') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '1' && mat[rLimit][cLimit + 1] == '1' &&
               mat[rLimit + 1][cLimit] == '0' &&
               mat[rLimit + 1][cLimit + 1] == '1') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '1' && mat[rLimit][cLimit + 1] == '1' &&
               mat[rLimit + 1][cLimit] == '1' &&
               mat[rLimit + 1][cLimit + 1] == '0') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
    } else if (mat[rLimit][cLimit] == '1' && mat[rLimit][cLimit + 1] == '1' &&
               mat[rLimit + 1][cLimit] == '1' &&
               mat[rLimit + 1][cLimit + 1] == '1') {
      vector<int> tAns;
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      ans.push_back(tAns);
      tAns.clear();
      tAns.push_back(rLimit + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1);
      tAns.push_back(rLimit + 1 + 1);
      tAns.push_back(cLimit + 1 + 1);
      ans.push_back(tAns);
    }
    cout << ans.size() << "\n";
    for (int i = 0; i < ans.size(); i++) {
      for (int j = 0; j < ans[i].size(); j++) {
        cout << ans[i][j] << " ";
      }
      cout << "\n";
    }
  }
  return 0;
}
