#include <bits/stdc++.h>
using namespace std;
long long gcd(long long int a, long long int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return (a / gcd(a, b)) * b; }
long long mfastPower(long long a, long long b, long long c) {
  long long res = 1;
  while (b > 0) {
    if ((b & 1) != 0) {
      res = ((res % c) * (a % c) % c);
    }
    a = ((a % c) * (a % c)) % c;
    b = b >> 1;
  }
  return res;
}
long long fastPower(long long a, long long b) {
  long long res = 1;
  while (b > 0) {
    if ((b & 1) != 0) {
      res = res * a;
    }
    a = a * a;
    b = b >> 1;
  }
  return res;
}
bool isPrime(long long n) {
  if (n <= 1) return false;
  if (n <= 3) return true;
  if (n % 2 == 0 || n % 3 == 0) return false;
  long long p = sqrt(n);
  for (long long i = 5; i <= p; i = i + 6)
    if (n % i == 0 || n % (i + 2) == 0) return false;
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long t;
  cin >> t;
  while (t--) {
    long long n, m;
    string str;
    cin >> n >> m;
    n++;
    m++;
    long long mat[n][m];
    for (long long i = 1; i < n; i++) {
      cin >> str;
      for (long long j = 1; j < m; j++) {
        if (str[j - 1] == '1')
          mat[i][j] = 1;
        else
          mat[i][j] = 0;
      }
    }
    vector<long long> res;
    long long cnt = 0;
    for (long long i = 1; i < m - 2; i++) {
      for (long long j = 1; j < n; j++) {
        if (j == n - 1 && mat[j][i] == 1) {
          mat[j][i] = 0;
          mat[j][i + 1] ^= 1;
          mat[j - 1][i + 1] ^= 1;
          res.push_back(j);
          res.push_back(i);
          res.push_back(j);
          res.push_back(i + 1);
          res.push_back(j - 1);
          res.push_back(i + 1);
          cnt++;
        } else if (mat[j][i] == 1) {
          mat[j][i] = 0;
          mat[j][i + 1] ^= 1;
          mat[j + 1][i + 1] ^= 1;
          res.push_back(j);
          res.push_back(i);
          res.push_back(j);
          res.push_back(i + 1);
          res.push_back(j + 1);
          res.push_back(i + 1);
          cnt++;
        }
      }
    }
    for (long long i = 1; i < n - 2; i++) {
      if (mat[i][m - 2] == 1) {
        mat[i][m - 2] = 0;
        mat[i + 1][m - 2] ^= 1;
        mat[i + 1][m - 1] ^= 1;
        res.push_back(i);
        res.push_back(m - 2);
        res.push_back(i + 1);
        res.push_back(m - 2);
        res.push_back(i + 1);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[i][m - 1] == 1) {
        mat[i][m - 1] = 0;
        mat[i + 1][m - 1] ^= 1;
        mat[i + 1][m - 2] ^= 1;
        res.push_back(i);
        res.push_back(m - 1);
        res.push_back(i + 1);
        res.push_back(m - 1);
        res.push_back(i + 1);
        res.push_back(m - 2);
        cnt++;
      }
    }
    while (1) {
      if (mat[n - 2][m - 2] == 0 && mat[n - 1][m - 2] == 0 &&
          mat[n - 2][m - 1] == 0 && mat[n - 1][m - 1] == 0) {
        break;
      }
      if (mat[n - 2][m - 2] == 1 && mat[n - 1][m - 2] == 1 &&
          mat[n - 2][m - 1] == 1 && mat[n - 1][m - 1] == 1) {
        mat[n - 2][m - 2] = 0;
        mat[n - 1][m - 2] = 0;
        mat[n - 2][m - 1] = 0;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 1 && mat[n - 1][m - 2] == 1 &&
          mat[n - 2][m - 1] == 1 && mat[n - 1][m - 1] == 0) {
        mat[n - 2][m - 2] = 0;
        mat[n - 1][m - 2] = 0;
        mat[n - 2][m - 1] = 0;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 0 && mat[n - 1][m - 2] == 1 &&
          mat[n - 2][m - 1] == 1 && mat[n - 1][m - 1] == 1) {
        mat[n - 1][m - 1] = 0;
        mat[n - 1][m - 2] = 0;
        mat[n - 2][m - 1] = 0;
        res.push_back(n - 1);
        res.push_back(m - 1);
        res.push_back(n - 1);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 1 && mat[n - 1][m - 2] == 0 &&
          mat[n - 2][m - 1] == 1 && mat[n - 1][m - 1] == 1) {
        mat[n - 2][m - 2] = 0;
        mat[n - 1][m - 1] = 0;
        mat[n - 2][m - 1] = 0;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 1);
        res.push_back(n - 2);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 1 && mat[n - 1][m - 2] == 1 &&
          mat[n - 2][m - 1] == 0 && mat[n - 1][m - 1] == 1) {
        mat[n - 2][m - 2] = 0;
        mat[n - 1][m - 2] = 0;
        mat[n - 1][m - 1] = 0;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 0 && mat[n - 1][m - 2] == 0 &&
          mat[n - 2][m - 1] == 1 && mat[n - 1][m - 1] == 1) {
        mat[n - 1][m - 1] = 0;
        mat[n - 1][m - 2] = 1;
        mat[n - 2][m - 2] = 1;
        res.push_back(n - 1);
        res.push_back(m - 1);
        res.push_back(n - 1);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 2);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 1 && mat[n - 1][m - 2] == 1 &&
          mat[n - 2][m - 1] == 0 && mat[n - 1][m - 1] == 0) {
        mat[n - 2][m - 2] = 0;
        mat[n - 2][m - 1] = 1;
        mat[n - 1][m - 1] = 1;
        res.push_back(n - 1);
        res.push_back(m - 1);
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 1 && mat[n - 1][m - 2] == 0 &&
          mat[n - 2][m - 1] == 0 && mat[n - 1][m - 1] == 1) {
        mat[n - 2][m - 2] = 0;
        mat[n - 2][m - 1] = 1;
        mat[n - 1][m - 2] = 1;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 1);
        res.push_back(n - 1);
        res.push_back(m - 2);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 0 && mat[n - 1][m - 2] == 1 &&
          mat[n - 2][m - 1] == 0 && mat[n - 1][m - 1] == 1) {
        mat[n - 2][m - 2] = 1;
        mat[n - 2][m - 1] = 1;
        mat[n - 1][m - 1] = 0;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 1);
        res.push_back(n - 1);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 1 && mat[n - 1][m - 2] == 0 &&
          mat[n - 2][m - 1] == 1 && mat[n - 1][m - 1] == 0) {
        mat[n - 2][m - 2] = 0;
        mat[n - 1][m - 2] = 1;
        mat[n - 1][m - 1] = 1;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 1);
        res.push_back(n - 1);
        res.push_back(m - 2);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 0 && mat[n - 1][m - 2] == 1 &&
          mat[n - 2][m - 1] == 1 && mat[n - 1][m - 1] == 0) {
        mat[n - 2][m - 2] = 1;
        mat[n - 2][m - 1] = 0;
        mat[n - 1][m - 1] = 1;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 1);
        res.push_back(n - 1);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 0 && mat[n - 1][m - 2] == 0 &&
          mat[n - 2][m - 1] == 0 && mat[n - 1][m - 1] == 1) {
        mat[n - 2][m - 2] = 1;
        mat[n - 2][m - 1] = 1;
        mat[n - 1][m - 1] = 0;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 1);
        res.push_back(n - 1);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 0 && mat[n - 1][m - 2] == 0 &&
          mat[n - 2][m - 1] == 1 && mat[n - 1][m - 1] == 0) {
        mat[n - 2][m - 2] = 1;
        mat[n - 2][m - 1] = 0;
        mat[n - 1][m - 1] = 1;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 2);
        res.push_back(m - 1);
        res.push_back(n - 1);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 0 && mat[n - 1][m - 2] == 1 &&
          mat[n - 2][m - 1] == 0 && mat[n - 1][m - 1] == 0) {
        mat[n - 2][m - 2] = 1;
        mat[n - 1][m - 2] = 0;
        mat[n - 1][m - 1] = 1;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 1);
        cnt++;
      }
      if (mat[n - 2][m - 2] == 1 && mat[n - 1][m - 2] == 0 &&
          mat[n - 2][m - 1] == 0 && mat[n - 1][m - 1] == 0) {
        mat[n - 2][m - 2] = 0;
        mat[n - 1][m - 2] = 1;
        mat[n - 1][m - 1] = 1;
        res.push_back(n - 2);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 2);
        res.push_back(n - 1);
        res.push_back(m - 1);
        cnt++;
      }
    }
    cout << cnt << endl;
    for (long long i = 0; i < res.size(); i += 6) {
      for (long long j = i; j < i + 6; j++) {
        cout << res[j] << " ";
      }
      cout << endl;
    }
  }
  return 0;
}
