#include <bits/stdc++.h>
using namespace std;
int T;
int N, M;
int A[105][105];
vector<pair<int, int> > ans;
void sol1(int x, int y) {
  if (!A[x][y] && !A[x][y + 1]) return;
  int cnt = 3;
  if (A[x][y]) {
    ans.push_back(make_pair(x, y));
    A[x][y] = 0;
    cnt--;
  }
  if (A[x][y + 1]) {
    ans.push_back(make_pair(x, y + 1));
    A[x][y + 1] = 0;
    cnt--;
  }
  if (cnt) {
    ans.push_back(make_pair(x + 1, y));
    A[x + 1][y] ^= 1;
    cnt--;
  }
  if (cnt) {
    ans.push_back(make_pair(x + 1, y + 1));
    A[x + 1][y + 1] ^= 1;
    cnt--;
  }
}
void sol3(vector<pair<int, int> >& V, int id) {
  if (id == 0) return;
  if (id == 3) {
    ans.push_back(V[0]);
    ans.push_back(V[2]);
    ans.push_back(V[3]);
  } else if (id == 2) {
    ans.push_back(V[0]);
    ans.push_back(V[1]);
    ans.push_back(V[3]);
    sol3(V, 3);
  } else if (id == 1) {
    ans.push_back(V[0]);
    ans.push_back(V[1]);
    ans.push_back(V[2]);
    sol3(V, 2);
  } else {
    ans.push_back(V[1]);
    ans.push_back(V[2]);
    ans.push_back(V[3]);
    sol3(V, 1);
  }
}
void sol2(int x, int y) {
  vector<pair<int, int> > vec[2];
  vec[A[x][y]].push_back(make_pair(x, y));
  vec[A[x][y + 1]].push_back(make_pair(x, y + 1));
  vec[A[x + 1][y]].push_back(make_pair(x + 1, y));
  vec[A[x + 1][y + 1]].push_back(make_pair(x + 1, y + 1));
  vector<pair<int, int> > V;
  int cnt1 = (int)(vec[1].size());
  if (cnt1 == 1) {
    V.push_back(vec[1][0]);
    V.push_back(vec[0][0]);
    V.push_back(vec[0][1]);
    V.push_back(vec[0][2]);
    sol3(V, 1);
  } else if (cnt1 == 2) {
    V.push_back(vec[0][0]);
    V.push_back(vec[1][0]);
    V.push_back(vec[1][1]);
    V.push_back(vec[0][1]);
    sol3(V, 2);
  } else if (cnt1 == 3) {
    V.push_back(vec[1][0]);
    V.push_back(vec[0][0]);
    V.push_back(vec[1][1]);
    V.push_back(vec[1][2]);
    sol3(V, 3);
  } else if (cnt1 == 4) {
    V.push_back(vec[1][0]);
    V.push_back(vec[1][1]);
    V.push_back(vec[1][2]);
    V.push_back(vec[1][3]);
    sol3(V, 4);
  }
  A[x][y] = 0;
  A[x][y + 1] = 0;
  A[x + 1][y] = 0;
  A[x + 1][y + 1] = 0;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> T;
  for (int t = 1; t <= T; t++) {
    cin >> N >> M;
    string str;
    for (int i = 1; i <= N; i++) {
      cin >> str;
      for (int j = 1; j <= M; j++) A[i][j] = (str[j - 1] == '1');
    }
    ans.clear();
    for (int i = 1; i <= N - 2; i++) {
      for (int j = 1; j <= M - 1; j += 2) {
        sol1(i, j);
      }
      if (M % 2 == 1) sol1(i, M - 1);
    }
    for (int j = 1; j <= M - 1; j += 2) {
      if (M % 2 == 1 && j == M - 2) {
        if (!A[N - 1][j] && !A[N][j]) break;
        int cnt = 3;
        if (A[N - 1][j]) {
          ans.push_back(make_pair(N - 1, j));
          A[N - 1][j] = 0;
          cnt--;
        }
        if (A[N][j]) {
          ans.push_back(make_pair(N, j));
          A[N][j] = 0;
          cnt--;
        }
        if (cnt) {
          ans.push_back(make_pair(N - 1, j + 1));
          A[N - 1][j + 1] ^= 1;
          cnt--;
        }
        if (cnt) {
          ans.push_back(make_pair(N, j + 1));
          A[N][j + 1] ^= 1;
          cnt--;
        }
      } else
        sol2(N - 1, j);
    }
    if (M % 2 == 1) sol2(N - 1, M - 1);
    int Z = (int)(ans.size());
    cout << Z / 3 << '\n';
    for (int i = 0; i <= Z / 3 - 1; i++) {
      for (int j = 0; j <= 2; j++) {
        cout << ans[i * 3 + j].first << ' ' << ans[i * 3 + j].second << ' ';
      }
      cout << '\n';
    }
  }
  return 0;
}
