#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool ylmin(T &a, T b) {
  return a < b ? 0 : (a = b, 1);
}
template <class T>
inline bool ylmax(T &a, T b) {
  return a > b ? 0 : (a = b, 1);
}
template <class T>
inline T abs(T x) {
  return x < 0 ? -x : x;
}
inline char read() {
  static const int IO_LEN = 1024 * 1024;
  static char buf[IO_LEN], *ioh, *iot;
  if (ioh == iot) {
    iot = (ioh = buf) + fread(buf, 1, IO_LEN, stdin);
    if (ioh == iot) return -1;
  }
  return *ioh++;
}
template <class T>
inline void read(T &x) {
  static int iosig;
  static char ioc;
  for (iosig = 0, ioc = read(); !isdigit(ioc); ioc = read())
    if (ioc == '-') iosig = 1;
  for (x = 0; isdigit(ioc); ioc = read()) x = (x << 1) + (x << 3) + (ioc ^ '0');
  if (iosig) x = -x;
}
const int MAXN = 110;
int T, n, m, a[MAXN][MAXN];
char s[MAXN][MAXN];
bool is[MAXN * MAXN];
struct Node {
  pair<int, int> x, y, z;
  friend bool operator==(Node a, Node b) {
    return a.x == b.x && a.y == b.y && a.z == b.z;
  }
};
vector<Node> t;
inline bool cmp(Node a, Node b) {
  if (a.x == b.x) {
    if (a.y == b.y)
      return a.z < b.z;
    else
      return a.y < b.y;
  } else
    return a.x < b.x;
}
int main() {
  for (scanf("%d", &T); T; T--) {
    t.clear();
    scanf("%d%d", &n, &m);
    for (int i = (1); i <= (n); i++) scanf("%s", s[i] + 1);
    for (int i = (1); i <= (n); i++)
      for (int j = (1); j <= (m); j++) a[i][j] = s[i][j] - '0';
    for (int i = (1); i <= (n - 1); i++) {
      for (int j = (1); j <= (m - 1); j++) {
        if (a[i][j]) {
          t.push_back({{i, j}, {i + 1, j}, {i, j + 1}});
          a[i][j] ^= 1;
          a[i + 1][j] ^= 1;
          a[i][j + 1] ^= 1;
        }
      }
    }
    for (int i = (1); i <= (n - 1); i++) {
      if (a[i][m]) {
        t.push_back({{i, m}, {i + 1, m - 1}, {i, m - 1}});
        t.push_back({{i + 1, m}, {i + 1, m - 1}, {i, m - 1}});
        a[i][m] ^= 1;
        a[i + 1][m] ^= 1;
      }
    }
    for (int i = (1); i <= (m - 1); i++) {
      if (a[n][i]) {
        t.push_back({{n, i}, {n - 1, i}, {n - 1, i + 1}});
        t.push_back({{n, i + 1}, {n - 1, i}, {n - 1, i + 1}});
        a[n][i] ^= 1;
        a[n][i + 1] ^= 1;
      }
    }
    if (a[n][m]) {
      t.push_back({{n, m}, {n - 1, m}, {n, m - 1}});
      t.push_back({{n, m}, {n - 1, m}, {n - 1, m - 1}});
      t.push_back({{n, m}, {n, m - 1}, {n - 1, m - 1}});
      a[n][m] ^= 1;
    }
    for (auto &s : t) {
      pair<int, int> x = s.x, y = s.y, z = s.z;
      if (x <= y && y <= z)
        s = {x, y, z};
      else if (x <= z && z <= y)
        s = {x, z, y};
      else if (y <= x && x <= z)
        s = {y, x, z};
      else if (y <= z && z <= x)
        s = {y, z, x};
      else if (z <= x && x <= y)
        s = {z, x, y};
      else
        s = {z, y, x};
    }
    sort(t.begin(), t.end(), cmp);
    int cnt = ((int)t.size());
    for (int i = (0); i <= (((int)t.size()) - 1); i++) {
      if (t[i] == t[i - 1] && !is[i] && !is[i - 1]) {
        is[i] = is[i - 1] = 1;
        cnt -= 2;
      }
    }
    cout << cnt << '\n';
    for (int i = (0); i <= (((int)t.size()) - 1); i++) {
      Node s = t[i];
      if (!is[i])
        printf("%d %d %d %d %d %d\n", s.x.first, s.x.second, s.y.first,
               s.y.second, s.z.first, s.z.second);
    }
    for (int i = (0); i <= (((int)t.size()) - 1); i++) is[i] = 0;
  }
  return 0;
}
