#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
ostream& operator<<(ostream& out, const pair<T1, T2>& p) {
  return (out << p.first << ' ' << p.second << endl);
}
const int INF = 1000000017;
const long long LLINF = 1000000000000000017LL;
const long double inf = 1.0 / 0.0;
const long double eps = 1e-9;
const int MOD = 1e9 + 7;
const int MOD2 = 1e9 + 9;
bool used[16] = {};
vector<pair<int, int> > d[16];
int make(char c1, char c2, char c3, char c4) {
  return int(c1 - '0') | (int(c2 - '0') << 1) | (int(c3 - '0') << 2) |
         (int(c4 - '0') << 3);
}
vector<pair<int, int> > res;
void chel(vector<string>& a, int x, int y) {
  res.emplace_back(x + 1, y + 1);
  a[x][y] = (a[x][y] == '0' ? '1' : '0');
}
void ch(vector<string>& a, int i, int j) {
  auto cur = d[make(a[i][j], a[i][j + 1], a[i + 1][j], a[i + 1][j + 1])];
  for (auto& el : cur) {
    int x = el.first + i, y = el.second + j;
    chel(a, x, y);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  queue<int> q;
  q.emplace(0);
  used[0] = 1;
  while (!q.empty()) {
    int cur = q.front();
    q.pop();
    for (int t = 0; t < 4; ++t) {
      int v = (cur ^ 15 ^ (1 << t));
      if (!used[v]) {
        used[v] = 1;
        q.emplace(v);
        d[v] = d[cur];
        if (t != 0) {
          d[v].emplace_back(0, 0);
        }
        if (t != 1) {
          d[v].emplace_back(0, 1);
        }
        if (t != 2) {
          d[v].emplace_back(1, 0);
        }
        if (t != 3) {
          d[v].emplace_back(1, 1);
        }
        reverse(d[v].begin(), d[v].end());
      }
    }
  }
  int t;
  cin >> t;
  while (t--) {
    res.clear();
    int n, m;
    cin >> n >> m;
    vector<string> a(n);
    for (int i = 0; i < n; ++i) {
      cin >> a[i];
    }
    if (n & 1) {
      for (int j = 0; j < m - 1; j += 2) {
        int left = 3;
        if (a[n - 1][j] == '1') {
          --left;
          chel(a, n - 1, j);
        }
        if (a[n - 1][j + 1] == '1') {
          --left;
          chel(a, n - 1, j + 1);
        }
        if (left == 3) {
          continue;
        }
        if (left) {
          --left;
          chel(a, n - 2, j);
        }
        if (left) {
          --left;
          chel(a, n - 2, j + 1);
        }
      }
    }
    if (m & 1) {
      for (int i = 0; i < n - 1; i += 2) {
        int left = 3;
        if (a[i][m - 1] == '1') {
          --left;
          chel(a, i, m - 1);
        }
        if (a[i + 1][m - 1] == '1') {
          --left;
          chel(a, i + 1, m - 1);
        }
        if (left == 3) {
          continue;
        }
        if (left) {
          --left;
          chel(a, i, m - 2);
        }
        if (left) {
          --left;
          chel(a, i + 1, m - 2);
        }
      }
    }
    if (a[n - 1][m - 1] == '1') {
      ch(a, n - 2, m - 2);
    }
    for (int i = 0; i < n - 1; i += 2) {
      for (int j = 0; j < m - 1; j += 2) {
        ch(a, i, j);
      }
    }
    cout << int(res.size()) / 3 << '\n';
    int z = 0;
    for (auto& el : res) {
      cout << el.first << ' ' << el.second << ' ';
      ++z;
      if (z == 3) {
        z = 0;
        cout << '\n';
      }
    }
  }
  return 0;
}
