#include <bits/stdc++.h>
using namespace std;
int t;
int n, m;
char a[150][150];
struct node {
  int p[8];
};
vector<node> ans;
int mx[4][2] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}};
void pint() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) cout << a[i][j];
    cout << endl;
  }
  cout << endl;
}
void ch(int x, int y) {
  if (a[x][y] == '0')
    a[x][y] = '1';
  else
    a[x][y] = '0';
}
void deal(int x, int y) {
  int x1 = x, y1 = y + 1;
  if (a[x][y] != '0' || a[x1][y1] != '0') {
    int k = 0, tot = 0;
    node p;
    if (a[x][y] != '0') {
      k++, ch(x, y);
      p.p[++tot] = x;
      p.p[++tot] = y;
    }
    if (a[x1][y1] != '0') {
      p.p[++tot] = x1;
      p.p[++tot] = y1;
      k++, ch(x1, y1);
    }
    if (k <= 2) {
      p.p[++tot] = x + 1;
      p.p[++tot] = y;
      ch(x + 1, y);
    }
    if (k <= 1) {
      p.p[++tot] = x + 1;
      p.p[++tot] = y + 1;
      ch(x + 1, y + 1);
    }
    ans.push_back(p);
  }
}
void mp(int x, int y, int lp) {
  if (lp == 0) return;
  if (lp == 4) {
    int tot = 0;
    node p;
    for (int i = 0; i < 3; i++) {
      int x1 = x + mx[i][0];
      int y1 = y + mx[i][1];
      if (a[x1][y1] == '1') {
        ch(x1, y1);
        p.p[++tot] = x1;
        p.p[++tot] = y1;
      }
    }
    ans.push_back(p);
    mp(x, y, 1);
    return;
  }
  if (lp == 3) {
    int tot = 0;
    node p;
    for (int i = 0; i <= 3; i++) {
      int x1 = x + mx[i][0];
      int y1 = y + mx[i][1];
      if (a[x1][y1] == '1') {
        ch(x1, y1);
        p.p[++tot] = x1;
        p.p[++tot] = y1;
      }
    }
    ans.push_back(p);
    return;
  }
  if (lp == 2) {
    int tot = 0;
    node p;
    int flag = 0;
    for (int i = 0; i <= 3; i++) {
      int x1 = x + mx[i][0];
      int y1 = y + mx[i][1];
      if (a[x1][y1] == '0') {
        ch(x1, y1);
        p.p[++tot] = x1;
        p.p[++tot] = y1;
      } else if (flag == 0) {
        ch(x1, y1);
        p.p[++tot] = x1;
        p.p[++tot] = y1;
        flag = 1;
      }
    }
    ans.push_back(p);
  }
  if (lp == 1) {
    int tot = 0;
    node p;
    int flag = 0;
    for (int i = 0; i <= 3; i++) {
      int x1 = x + mx[i][0];
      int y1 = y + mx[i][1];
      if (a[x1][y1] == '1') {
        ch(x1, y1);
        p.p[++tot] = x1;
        p.p[++tot] = y1;
      } else if (flag < 2) {
        ch(x1, y1);
        p.p[++tot] = x1;
        p.p[++tot] = y1;
        flag++;
      }
    }
    ans.push_back(p);
  }
  mp(x, y, lp + 1);
}
void dealp(int x, int y) {
  int o = 0;
  for (int i = 0; i <= 3; i++) {
    int x1 = x + mx[i][0];
    int y1 = y + mx[i][1];
    if (a[x1][y1] == '1') o++;
  }
  mp(x, y, o);
}
int main() {
  cin >> t;
  while (t--) {
    cin >> n >> m;
    ans.clear();
    for (int i = 1; i <= n; i++) scanf("%s", a[i] + 1);
    for (int i = 1; i < n - 1; i++) {
      for (int j = 1; j < m; j += 2) deal(i, j);
      if (m & 1) deal(i, m - 1);
    }
    for (int j = 1; j < m; j += 2) {
      dealp(n - 1, j);
    }
    if (m & 1) dealp(n - 1, m - 1);
    cout << ans.size() << endl;
    for (auto &i : ans) {
      for (int j = 1; j <= 6; j++) cout << i.p[j] << " ";
      cout << endl;
    }
  }
  return 0;
}
