#include <bits/stdc++.h>
using namespace std;
const int mxN = 8e5 + 100;
const long long MOD = 1e9 + 7;
void fast() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
vector<long long> factorial;
long long expo(long long x, long long exp) {
  if (exp <= 0) return 1;
  long long tmp = (x * x) % MOD;
  if (exp % 2) {
    return (expo(tmp, exp / 2) * x) % MOD;
  }
  return (expo(tmp, exp / 2)) % MOD;
}
long long choice(long long n, long long r) {
  if (n < r) return 0;
  long long numer = factorial[n];
  long long denom = (factorial[r] * factorial[n - r]) % MOD;
  return numer * expo(denom, MOD - 2) % MOD;
}
vector<vector<int>> ops;
int dx[4] = {0, 0, 1, 1}, dy[4] = {0, 1, 0, 1};
void solve(vector<vector<int>> &v, int x, int y) {
  int ctrr = 0;
  vector<bool> isOne(4, false);
  for (int i = 0; i < 4; ++i) {
    int nx = x + dx[i], ny = y + dy[i];
    if (v[nx][ny]) {
      ++ctrr;
      isOne[i] = true;
    }
  }
  if (ctrr == 0) return;
  if (ctrr == 1) {
    vector<int> entry(6);
    if (v[x + 1][y + 1]) {
      for (int i = 0; i < 3; ++i) {
        int nx = x + dx[i], ny = y + dy[i];
        if (i == 2) {
          nx = x + 1;
          ny = y + 1;
        }
        entry[2 * i] = nx;
        entry[2 * i + 1] = ny;
        v[nx][ny] = 1 - v[nx][ny];
      }
    } else {
      for (int i = 0; i < 3; ++i) {
        int nx = x + dx[i], ny = y + dy[i];
        entry[2 * i] = nx;
        entry[2 * i + 1] = ny;
        v[nx][ny] = 1 - v[nx][ny];
      }
    }
    ops.push_back(entry);
  } else if (ctrr == 2) {
    vector<int> entry(6);
    bool found = false;
    int ctr = 0;
    for (int i = 0; i < 4; ++i) {
      if (!found && isOne[i]) {
        found = true;
        continue;
      }
      int nx = x + dx[i], ny = y + dy[i];
      entry[2 * ctr] = nx;
      entry[2 * ctr + 1] = ny;
      v[nx][ny] = 1 - v[nx][ny];
      ctr++;
    }
    ops.push_back(entry);
  } else if (ctrr == 3) {
    vector<int> entry(6);
    int ctr = 0;
    for (int i = 0; i < 4; ++i) {
      if (!isOne[i]) {
        continue;
      }
      int nx = x + dx[i], ny = y + dy[i];
      entry[2 * ctr] = nx;
      entry[2 * ctr + 1] = ny;
      v[nx][ny] = 1 - v[nx][ny];
      ++ctr;
    }
    ops.push_back(entry);
  } else {
    vector<int> entry(6);
    for (int i = 0; i < 3; ++i) {
      int nx = x + dx[i], ny = y + dy[i];
      entry[2 * i] = nx;
      entry[2 * i + 1] = ny;
      v[nx][ny] = 1 - v[nx][ny];
    }
    ops.push_back(entry);
  }
  solve(v, x, y);
}
int main() {
  fast();
  int t;
  cin >> t;
  while (t--) {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> v(n, vector<int>(m));
    char c;
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < m; ++j) {
        cin >> c;
        v[i][j] = c - '0';
      }
    }
    for (int i = 0; i < n; i += 2) {
      if (i == n - 1) --i;
      for (int j = 0; j < m; ++j) {
        if (j == m - 2) {
          solve(v, i, j);
          break;
        } else {
          if (v[i][j] == 0 && v[i + 1][j] == 0) {
          } else {
            vector<pair<int, int>> flips;
            if (v[i][j]) flips.push_back({i, j});
            if (v[i + 1][j]) flips.push_back({i + 1, j});
            flips.push_back({i, j + 1});
            v[i][j + 1] = 1 - v[i][j + 1];
            if ((int)flips.size() < 3) {
              flips.push_back({i + 1, j + 1});
              v[i + 1][j + 1] = 1 - v[i + 1][j + 1];
            }
            v[i][j] = 0;
            v[i + 1][j] = 0;
            ops.push_back({flips[0].first, flips[0].second, flips[1].first,
                           flips[1].second, flips[2].first, flips[2].second});
          }
        }
      }
    }
    cout << ops.size() << "\n";
    for (auto &x : ops) {
      for (int y : x) {
        cout << y + 1 << " ";
      }
      cout << "\n";
    }
    ops.clear();
  }
}
