#include <bits/stdc++.h>
using namespace std;
struct box {
  pair<int, int> a, b, c;
};
vector<pair<int, int> > pos;
vector<box> ans;
vector<pair<int, int> > last;
int n, m, o[1000][1000];
void solve(int cnt) {
  pos.clear();
  if (cnt == 0) {
    return;
  } else if (cnt == 1) {
    int one = 0, zero = 0;
    for (pair<int, int> e : last) {
      int a = e.first, b = e.second;
      if (one < 1 && o[a][b]) {
        pos.push_back({a, b});
        one++;
      } else if (zero < 2 && o[a][b] == 0) {
        pos.push_back({a, b});
        zero++;
      }
    }
    ans.push_back({{pos[0].first, pos[0].second},
                   {pos[1].first, pos[1].second},
                   {pos[2].first, pos[2].second}});
    o[pos[0].first][pos[0].second] ^= 1;
    o[pos[1].first][pos[1].second] ^= 1;
    o[pos[2].first][pos[2].second] ^= 1;
    solve(2);
  } else if (cnt == 2) {
    int one = 0, zero = 0;
    for (pair<int, int> e : last) {
      int a = e.first, b = e.second;
      if (one < 1 && o[a][b]) {
        pos.push_back({a, b});
        one++;
      } else if (zero < 2 && o[a][b] == 0) {
        pos.push_back({a, b});
        zero++;
      }
    }
    ans.push_back({{pos[0].first, pos[0].second},
                   {pos[1].first, pos[1].second},
                   {pos[2].first, pos[2].second}});
    o[pos[0].first][pos[0].second] ^= 1;
    o[pos[1].first][pos[1].second] ^= 1;
    o[pos[2].first][pos[2].second] ^= 1;
    solve(3);
  } else if (cnt == 3) {
    int one = 0, zero = 0;
    for (pair<int, int> e : last) {
      int a = e.first, b = e.second;
      if (one < 3 && o[a][b]) {
        pos.push_back({a, b});
        one++;
      }
    }
    ans.push_back({{pos[0].first, pos[0].second},
                   {pos[1].first, pos[1].second},
                   {pos[2].first, pos[2].second}});
    o[pos[0].first][pos[0].second] ^= 1;
    o[pos[1].first][pos[1].second] ^= 1;
    o[pos[2].first][pos[2].second] ^= 1;
    solve(0);
  } else if (cnt == 4) {
    int one = 0, zero = 0;
    for (pair<int, int> e : last) {
      int a = e.first, b = e.second;
      if (one < 3 && o[a][b]) {
        pos.push_back({a, b});
        one++;
      }
    }
    ans.push_back({{pos[0].first, pos[0].second},
                   {pos[1].first, pos[1].second},
                   {pos[2].first, pos[2].second}});
    o[pos[0].first][pos[0].second] ^= 1;
    o[pos[1].first][pos[1].second] ^= 1;
    o[pos[2].first][pos[2].second] ^= 1;
    solve(1);
  } else {
    o[1111][1111] = 1;
    puts("ERROR");
    return;
  }
}
int main(void) {
  int q;
  scanf("%d", &q);
  while (q--) {
    ans.clear();
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        scanf("%1d", &o[i][j]);
      }
    }
    for (int i = 0; i + 2 < n; i++) {
      for (int j = 0; j + 2 < m; j++) {
        if (o[i][j] == 1) {
          ans.push_back({{i, j}, {i + 1, j}, {i, j + 1}});
          o[i][j] ^= 1;
          o[i + 1][j] ^= 1;
          o[i][j + 1] ^= 1;
        }
      }
    }
    int f = m - 2, s = m - 1;
    for (int i = 0; i + 2 < n; i++) {
      if (o[i][f] && o[i][s]) {
        ans.push_back({{i, f}, {i, s}, {i + 1, f}});
        o[i][f] ^= 1;
        o[i][s] ^= 1;
        o[i + 1][f] ^= 1;
      } else if (o[i][f]) {
        ans.push_back({{i, f}, {i + 1, f}, {i + 1, s}});
        o[i][f] ^= 1;
        o[i + 1][f] ^= 1;
        o[i + 1][s] ^= 1;
      } else if (o[i][s]) {
        ans.push_back({{i, s}, {i + 1, f}, {i + 1, s}});
        o[i][s] ^= 1;
        o[i + 1][f] ^= 1;
        o[i + 1][s] ^= 1;
      }
    }
    f = n - 2, s = n - 1;
    for (int j = 0; j + 2 < m; j++) {
      if (o[f][j] && o[s][j]) {
        ans.push_back({{f, j}, {s, j}, {f, j + 1}});
        o[f][j] ^= 1;
        o[s][j] ^= 1;
        o[f][j + 1] ^= 1;
      } else if (o[f][j]) {
        ans.push_back({{f, j}, {f, j + 1}, {s, j + 1}});
        o[f][j] ^= 1;
        o[f][j + 1] ^= 1;
        o[s][j + 1] ^= 1;
      } else if (o[s][j]) {
        ans.push_back({{s, j}, {f, j + 1}, {s, j + 1}});
        o[s][j] ^= 1;
        o[f][j + 1] ^= 1;
        o[s][j + 1] ^= 1;
      }
    }
    last.clear();
    int cur = 0;
    for (int i = n - 2; i < n; i++) {
      for (int j = m - 2; j < m; j++) {
        last.push_back({i, j});
        if (o[i][j] == 1) {
          cur++;
        }
      }
    }
    solve(cur);
    printf("%d\n", ans.size());
    for (box e : ans) {
      printf("%d %d %d %d %d %d\n", e.a.first + 1, e.a.second + 1,
             e.b.first + 1, e.b.second + 1, e.c.first + 1, e.c.second + 1);
    }
  }
}
