#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 9;
const long long mod = 1e9 + 7;
template <class A>
void read(A& a) {
  a = 0;
  int c = getchar(), f = 0;
  for (; !isdigit(c); c = getchar()) f |= c == '-';
  for (; isdigit(c); c = getchar()) a = a * 10 + (c ^ 48);
  if (f) a = -a;
}
template <class A, class... B>
void read(A& a, B&... b) {
  read(a);
  read(b...);
}
template <class T>
inline void print(T x) {
  if (x < 0) x = ~x + 1, putchar('-');
  if (x > 9) print(x / 10);
  putchar(x % 10 + '0');
}
const int N = 110;
const int dx[4] = {0, 0, 1, 1};
const int dy[4] = {0, 1, 1, 0};
int mp[N][N];
int n, m;
struct Node {
  int x1, y1, x2, y2, x3, y3;
  Node(){};
  Node(int x1, int y1, int x2, int y2, int x3, int y3)
      : x1(x1), y1(y1), x2(x2), y2(y2), x3(x3), y3(y3) {}
};
vector<Node> ans;
void change(int x, int y, int id) {
  mp[x][y] ^= 1;
  if (id == 1)
    mp[x][y + 1] ^= 1, mp[x + 1][y] ^= 1,
        ans.push_back(Node(x, y, x, y + 1, x + 1, y));
  else if (id == 2)
    mp[x][y - 1] ^= 1, mp[x + 1][y] ^= 1,
        ans.push_back(Node(x, y, x, y - 1, x + 1, y));
  else if (id == 3)
    mp[x][y - 1] ^= 1, mp[x - 1][y] ^= 1,
        ans.push_back(Node(x, y, x, y - 1, x - 1, y));
  else
    mp[x][y + 1] ^= 1, mp[x - 1][y] ^= 1,
        ans.push_back(Node(x, y, x, y + 1, x - 1, y));
}
void check(int x, int y) {
  int sum = 0;
  for (int k = 0; k < 4; k++) {
    int tx = x + dx[k], ty = y + dy[k];
    if (mp[tx][ty] == 1) sum++;
  }
  if (sum == 4) {
    for (int k = 0; k < 4; k++) change(x + dx[k], y + dy[k], k + 1);
  } else if (sum == 3) {
    for (int k = 0; k < 4; k++) {
      int tx = x + dx[k], ty = y + dy[k];
      if (mp[tx][ty] == 0) {
        change(x + dx[(k + 2) % 4], y + dy[(k + 2) % 4], (k + 2) % 4 + 1);
        break;
      }
    }
  } else if (sum == 0)
    ;
  else {
    if (sum == 1)
      for (int k = 0; k < 4; k++) {
        int tx = x + dx[k], ty = y + dy[k];
        if (mp[tx][ty] == 1) {
          change(tx, ty, k + 1);
          break;
        }
      }
    vector<int> vec;
    if (mp[x][y] != mp[x][y + 1] && mp[x][y] != mp[x + 1][y]) {
      for (int k = 0; k < 4; k++) {
        int tx = x + dx[k], ty = y + dy[k];
        if (mp[tx][ty] == 1) vec.push_back(k);
      }
    } else {
      for (int k = 0; k < 4; k++) {
        int tx = x + dx[k], ty = y + dy[k];
        if (mp[tx][ty] == 0) vec.push_back(k);
      }
    }
    for (int i = 0; i < vec.size(); i++) {
      int k = vec[i];
      change(x + dx[k], y + dy[k], k + 1);
    }
  }
}
int main() {
  int T;
  read(T);
  while (T--) {
    int n, m;
    read(n, m);
    char ch;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) {
        cin >> ch;
        if (ch == '1')
          mp[i][j] = 1;
        else
          mp[i][j] = 0;
      }
    for (int i = 1; i <= n - 2; i++)
      for (int j = 1; j <= m; j++) {
        if (mp[i][j] == 1 && j != m) change(i + 1, j, 4);
        if (mp[i][j] == 1 && j == m) change(i + 1, j, 3);
      }
    if (m & 1) {
      if (mp[n - 1][m] == 1) change(n - 1, m - 1, 1);
      if (mp[n][m] == 1) change(n, m - 1, 4);
    }
    int i = n - 1;
    for (int j = 1; j < m; j += 2) {
      check(i, j);
    }
    cout << ans.size() << endl;
    for (auto t : ans) {
      cout << t.x1 << " " << t.y1 << " " << t.x2 << " " << t.y2 << " " << t.x3
           << " " << t.y3 << endl;
    }
    ans.clear();
  }
}
