#include <bits/stdc++.h>
using namespace std;
long long int MOD(long long int x) { return x % 1000000007; }
void swap(long long int &a, long long int &b) {
  long long int t = a;
  a = b;
  b = t;
}
long long int gcd(long long int a, long long int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long int fpow(long long int a, long long int x, long long int M) {
  if (x == 0) return 1;
  long long int temp = fpow(a, x / 2, M);
  temp = (temp * temp) % M;
  if (x % 2 == 1) temp *= a;
  return temp % M;
}
long long int invMod(long long int a, long long int M) {
  return fpow(a, M - 2, M);
}
void call();
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long int t;
  cin >> t;
  for (long long int i = 0; i < t; i++) call();
  return 0;
}
void call() {
  long long int n, m;
  cin >> n >> m;
  vector<vector<char>> mat(n, vector<char>(m));
  for (long long int i = 0; i < n; i++)
    for (long long int j = 0; j < m; j++) cin >> mat[i][j];
  vector<vector<long long int>> ops;
  long long int x1, y1, x2, y2, x3, y3;
  for (long long int i = 0; i < n - 1; i++) {
    for (long long int j = 0; j < m - 1; j++) {
      if (mat[i][j] == '1' && mat[i][j + 1] == '1') {
        x1 = i + 1;
        y1 = j + 1;
        x2 = i + 1;
        y2 = j + 2;
        x3 = i + 2;
        y3 = j + 2;
        if (mat[i + 1][j] == '1') y3 = j + 1;
        ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
      } else if (mat[i][j] == '1') {
        if (j + 2 < m && mat[i][j + 2] == '1') {
          x1 = i + 1;
          y1 = j + 1;
          x2 = i + 1;
          y2 = j + 2;
          x3 = i + 2;
          y3 = j + 2;
        } else {
          x1 = i + 1;
          y1 = j + 1;
          x2 = i + 2;
          y2 = j + 1;
          x3 = i + 2;
          y3 = j + 2;
        }
        ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
      } else
        continue;
      mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
      mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
      mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
    }
    if (mat[i][m - 1] == '1') {
      x1 = i + 1;
      y1 = m;
      x2 = i + 2;
      y2 = m - 1;
      x3 = i + 2;
      y3 = m;
      ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
      mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
      mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
      mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
    }
  }
  for (long long int j = 0; j < m - 1; j++) {
    char k1 = mat[n - 1][j], k2 = mat[n - 1][j + 1], k3;
    if (j + 2 < m) k3 = mat[n - 1][j + 2];
    if (k1 == '1' && k2 == '1') {
      x1 = n;
      y1 = j + 1;
      x2 = n - 1;
      y2 = j + 1;
      x3 = n - 1;
      y3 = j + 2;
      ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
      mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
      mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
      mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
      x1 = n;
      y1 = j + 2;
      x2 = n - 1;
      y2 = j + 1;
      x3 = n - 1;
      y3 = j + 2;
      ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
      mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
      mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
      mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
    } else if (k1 == '1') {
      if (j + 2 < m && k3 == '1') {
        x1 = n;
        y1 = j + 1;
        x2 = n - 1;
        y2 = j + 1;
        x3 = n - 1;
        y3 = j + 2;
        ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
        mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
        mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
        mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
        x1 = n;
        y1 = j + 2;
        x2 = n - 1;
        y2 = j + 1;
        x3 = n - 1;
        y3 = j + 2;
        ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
        mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
        mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
        mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
      } else {
        x1 = n - 1;
        y1 = j + 1;
        x2 = n;
        y2 = j + 1;
        x3 = n;
        y3 = j + 2;
        ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
        mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
        mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
        mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
        x1 = n - 1;
        y1 = j + 1;
        x2 = n - 1;
        y2 = j + 2;
        x3 = n;
        y3 = j + 1;
        ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
        mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
        mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
        mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
        x1 = n - 1;
        y1 = j + 2;
        x2 = n;
        y2 = j + 1;
        x3 = n;
        y3 = j + 2;
        ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
        mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
        mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
        mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
      }
    } else
      continue;
  }
  if (mat[n - 1][m - 1] == '1') {
    x1 = n - 1;
    y1 = m - 1;
    x2 = n;
    y2 = m - 1;
    x3 = n;
    y3 = m;
    ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
    mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
    mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
    mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
    x1 = n - 1;
    y1 = m - 1;
    x2 = n - 1;
    y2 = m;
    x3 = n;
    y3 = m;
    ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
    mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
    mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
    mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
    x1 = n - 1;
    y1 = m;
    x2 = n;
    y2 = m - 1;
    x3 = n;
    y3 = m;
    ops.push_back(vector<long long int>{x1, y1, x2, y2, x3, y3});
    mat[x1 - 1][y1 - 1] = (mat[x1 - 1][y1 - 1] == '0') ? '1' : '0';
    mat[x2 - 1][y2 - 1] = (mat[x2 - 1][y2 - 1] == '0') ? '1' : '0';
    mat[x3 - 1][y3 - 1] = (mat[x3 - 1][y3 - 1] == '0') ? '1' : '0';
  }
  cout << ops.size() << "\n";
  for (auto v : ops) {
    for (auto x : v) {
      cout << x << " ";
    }
    cout << "\n";
  };
  return;
}
