#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m;
struct node {
  int a;
  int b;
  int c;
  int d;
  int e;
  int f;
};
char cc[100][100];
vector<node> ans;
int cnt = 0;
void sub(int i, int j) {
  if (i == n - 1) i--;
  if (j == m - 1) j--;
  if (cc[i][j] == '0' && cc[i + 1][j] == '0' && cc[i][j + 1] == '0' &&
      cc[i + 1][j + 1] == '0') {
    return;
  } else if (cc[i][j] == '0' && cc[i + 1][j] == '0' && cc[i][j + 1] == '0' &&
             cc[i + 1][j + 1] == '1') {
    ans.push_back({i, j, i + 1, j, i + 1, j + 1});
    ans.push_back({i, j + 1, i + 1, j, i + 1, j + 1});
    ans.push_back({i, j + 1, i, j, i + 1, j + 1});
    cnt += 3;
  } else if (cc[i][j] == '0' && cc[i + 1][j] == '0' && cc[i][j + 1] == '1' &&
             cc[i + 1][j + 1] == '0') {
    ans.push_back({i, j + 1, i, j, i + 1, j + 1});
    ans.push_back({i, j + 1, i + 1, j, i + 1, j + 1});
    ans.push_back({i, j + 1, i, j, i + 1, j});
    cnt += 3;
  } else if (cc[i][j] == '0' && cc[i + 1][j] == '0' && cc[i][j + 1] == '1' &&
             cc[i + 1][j + 1] == '1') {
    ans.push_back({i, j + 1, i + 1, j, i, j});
    ans.push_back({i + 1, j + 1, i, j, i + 1, j});
    cnt += 2;
  } else if (cc[i][j] == '0' && cc[i + 1][j] == '1' && cc[i][j + 1] == '0' &&
             cc[i + 1][j + 1] == '0') {
    ans.push_back({i + 1, j, i, j, i, j + 1});
    ans.push_back({i, j + 1, i + 1, j, i + 1, j + 1});
    ans.push_back({i + 1, j + 1, i, j, i + 1, j});
    cnt += 3;
  } else if (cc[i][j] == '0' && cc[i + 1][j] == '1' && cc[i][j + 1] == '0' &&
             cc[i + 1][j + 1] == '1') {
    ans.push_back({i, j + 1, i + 1, j, i, j});
    ans.push_back({i, j + 1, i, j, i + 1, j + 1});
    cnt += 2;
  } else if (cc[i][j] == '0' && cc[i + 1][j] == '1' && cc[i][j + 1] == '1' &&
             cc[i + 1][j + 1] == '0') {
    ans.push_back({i + 1, j + 1, i + 1, j, i, j});
    ans.push_back({i, j + 1, i, j, i + 1, j + 1});
    cnt += 2;
  } else if (cc[i][j] == '0' && cc[i + 1][j] == '1' && cc[i][j + 1] == '1' &&
             cc[i + 1][j + 1] == '1') {
    ans.push_back({i + 1, j, i, j + 1, i + 1, j + 1});
    cnt++;
  } else if (cc[i][j] == '1' && cc[i + 1][j] == '0' && cc[i][j + 1] == '0' &&
             cc[i + 1][j + 1] == '0') {
    ans.push_back({i + 1, j + 1, i, j, i, j + 1});
    ans.push_back({i, j + 1, i + 1, j, i, j});
    ans.push_back({i + 1, j + 1, i, j, i + 1, j});
    cnt += 3;
  } else if (cc[i][j] == '1' && cc[i + 1][j] == '0' && cc[i][j + 1] == '0' &&
             cc[i + 1][j + 1] == '1') {
    ans.push_back({i, j + 1, i + 1, j, i + 1, j + 1});
    ans.push_back({i, j + 1, i, j, i + 1, j});
    cnt += 2;
  } else if (cc[i][j] == '1' && cc[i + 1][j] == '0' && cc[i][j + 1] == '1' &&
             cc[i + 1][j + 1] == '0') {
    ans.push_back({i, j + 1, i + 1, j, i + 1, j + 1});
    ans.push_back({i + 1, j + 1, i, j, i + 1, j});
    cnt += 2;
  } else if (cc[i][j] == '1' && cc[i + 1][j] == '0' && cc[i][j + 1] == '1' &&
             cc[i + 1][j + 1] == '1') {
    ans.push_back({i, j + 1, i, j, i + 1, j + 1});
    cnt += 1;
  } else if (cc[i][j] == '1' && cc[i + 1][j] == '1' && cc[i][j + 1] == '0' &&
             cc[i + 1][j + 1] == '0') {
    ans.push_back({i, j + 1, i + 1, j, i + 1, j + 1});
    ans.push_back({i, j + 1, i, j, i + 1, j + 1});
    cnt += 2;
  } else if (cc[i][j] == '1' && cc[i + 1][j] == '1' && cc[i][j + 1] == '0' &&
             cc[i + 1][j + 1] == '1') {
    ans.push_back({i + 1, j + 1, i, j, i + 1, j});
    cnt += 1;
  } else if (cc[i][j] == '1' && cc[i + 1][j] == '1' && cc[i][j + 1] == '1' &&
             cc[i + 1][j + 1] == '0') {
    ans.push_back({i, j + 1, i, j, i + 1, j});
    cnt += 1;
  } else if (cc[i][j] == '1' && cc[i + 1][j] == '1' && cc[i][j + 1] == '1' &&
             cc[i + 1][j + 1] == '1') {
    ans.push_back({i, j, i + 1, j, i, j + 1});
    ans.push_back({i, j, i + 1, j, i + 1, j + 1});
    ans.push_back({i, j + 1, i + 1, j, i + 1, j + 1});
    ans.push_back({i, j + 1, i, j, i + 1, j + 1});
    cnt += 4;
  }
  cc[i][j] = '0';
  cc[i + 1][j] = '0';
  cc[i][j + 1] = '0';
  cc[i + 1][j + 1] = '0';
  return;
}
void sub1(int i, int j) {
  if (cc[i][j] == '0') return;
  if (j == m - 1) {
    ans.push_back({i, j, i + 1, j, i + 1, j - 1});
    cc[i + 1][j] = '0' + (1 - (cc[i + 1][j] - '0'));
    cc[i + 1][j - 1] = '0' + (1 - (cc[i + 1][j - 1] - '0'));
    cnt += 1;
  } else {
    ans.push_back({i, j, i + 1, j, i + 1, j + 1});
    cc[i + 1][j] = '0' + (1 - (cc[i + 1][j] - '0'));
    cc[i + 1][j + 1] = '0' + (1 - (cc[i + 1][j + 1] - '0'));
    cnt += 1;
  }
  return;
}
void sub2(int i, int j) {
  if (cc[i][j] == '0') return;
  if (i == n - 1) {
    ans.push_back({i, j, i, j + 1, i - 1, j + 1});
    cc[i][j + 1] = '0' + (1 - (cc[i][j + 1] - '0'));
    cc[i - 1][j + 1] = '0' + (1 - (cc[i - 1][j + 1] - '0'));
    cnt += 1;
  } else {
    ans.push_back({i, j, i, j + 1, i + 1, j + 1});
    cc[i][j + 1] = '0' + (1 - (cc[i][j + 1] - '0'));
    cc[i + 1][j + 1] = '0' + (1 - (cc[i + 1][j + 1] - '0'));
    cnt += 1;
  }
  return;
}
void solve() {
  cin >> n >> m;
  for (long long int i = 0; i < n; ++i)
    for (long long int j = 0; j < m; ++j) cin >> cc[i][j];
  int i = 0, j = 0;
  cnt = 0;
  ans.clear();
  for (long long int i = 0; i < n - 2; ++i) {
    for (long long int j = 0; j < m; ++j) sub1(i, j);
  }
  for (long long int j = 0; j < m - 2; ++j)
    for (long long int i = n - 2; i <= n - 1; ++i) {
      sub2(i, j);
    }
  sub(n - 2, m - 2);
  cout << cnt << '\n';
  for (auto i : ans) {
    cout << i.a + 1 << ' ' << i.b + 1 << ' ' << i.c + 1 << ' ' << i.d + 1 << ' '
         << i.e + 1 << ' ' << i.f + 1 << '\n';
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int t = 1, tmp = 0;
  cin >> t;
  while (t--) {
    solve();
  }
  cerr << "Time : " << (double)clock() / (double)CLOCKS_PER_SEC << "s\n";
  return 0;
}
