#include <bits/stdc++.h>
using namespace std;
int read() {
  int f = 1, x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -f;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  return f * x;
}
inline int lowbit(int x) { return x & (-x); }
inline int modadd(int x, int y) {
  return (x + y >= 1000000007 ? x + y - 1000000007 : x + y);
}
inline int sgn(int x) { return (x < 0 ? -1 : (x > 0 ? 1 : 0)); }
template <typename T>
T gcd(T a, T b) {
  return (!b) ? a : gcd(b, a % b);
}
int poww(int a, int b) {
  int res = 1;
  while (b > 0) {
    if (b & 1) res = 1ll * res * a % 1000000007;
    a = 1ll * a * a % 1000000007, b >>= 1;
  }
  return res;
}
const int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
const int ddx[] = {-1, -1, -1, 0, 0, 1, 1, 1},
          ddy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
int n, m;
char mat[105][105];
int mm[105][105];
vector<pair<int, int> > vec[3];
void ctr(int x, int y) {
  int &v1 = mm[x][y];
  int &v2 = mm[x + 1][y];
  int &v3 = mm[x][y + 1];
  int &v4 = mm[x + 1][y + 1];
  if (!v1 && !v2) return;
  if (v1 && v2) {
    v1 ^= 1, v2 ^= 1, v3 ^= 1;
    vec[0].emplace_back(x, y);
    vec[1].emplace_back(x + 1, y);
    vec[2].emplace_back(x, y + 1);
  } else if (v1) {
    v1 ^= 1, v4 ^= 1, v3 ^= 1;
    vec[0].emplace_back(x, y);
    vec[1].emplace_back(x, y + 1);
    vec[2].emplace_back(x + 1, y + 1);
  } else {
    v2 ^= 1, v4 ^= 1, v3 ^= 1;
    vec[0].emplace_back(x + 1, y);
    vec[1].emplace_back(x, y + 1);
    vec[2].emplace_back(x + 1, y + 1);
  }
}
void ctd(int x, int y) {
  int &v1 = mm[x][y];
  int &v3 = mm[x + 1][y];
  int &v2 = mm[x][y + 1];
  int &v4 = mm[x + 1][y + 1];
  if (!v1 && !v2) return;
  if (v1 && v2) {
    v1 ^= 1, v2 ^= 1, v3 ^= 1;
    vec[0].emplace_back(x, y);
    vec[1].emplace_back(x + 1, y);
    vec[2].emplace_back(x, y + 1);
  } else if (v1) {
    v1 ^= 1, v4 ^= 1, v3 ^= 1;
    vec[0].emplace_back(x, y);
    vec[1].emplace_back(x + 1, y);
    vec[2].emplace_back(x + 1, y + 1);
  } else {
    v2 ^= 1, v4 ^= 1, v3 ^= 1;
    vec[0].emplace_back(x, y + 1);
    vec[1].emplace_back(x + 1, y);
    vec[2].emplace_back(x + 1, y + 1);
  }
}
void init() {
  n = read(), m = read();
  for (int i = 1; i <= n; ++i) scanf("%s", mat[i] + 1);
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) mm[i][j] = mat[i][j] - '0';
  vec[0].clear();
  vec[1].clear();
  vec[2].clear();
}
bool final_solve(int x, int y) {
  int &v1 = mm[x][y];
  int &v2 = mm[x][y + 1];
  int &v3 = mm[x + 1][y];
  int &v4 = mm[x + 1][y + 1];
  int cntt = v1 + v2 + v3 + v4;
  if (cntt == 0) {
    return true;
  }
  if (cntt == 3) {
    if (!v1) {
      v4 ^= 1, v2 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x + 1, y + 1);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x, y + 1);
    } else if (!v2) {
      v4 ^= 1, v1 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x + 1, y + 1);
    } else if (!v3) {
      v4 ^= 1, v1 ^= 1, v2 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x, y + 1);
      vec[2].emplace_back(x + 1, y + 1);
    } else {
      v1 ^= 1, v2 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x, y + 1);
    }
    return true;
  }
  if (cntt == 1) {
    if (v1) {
      v1 ^= 1, v2 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x, y + 1);
    } else if (v4) {
      v4 ^= 1, v2 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x + 1, y + 1);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x, y + 1);
    } else if (v3) {
      v4 ^= 1, v1 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x + 1, y + 1);
    } else if (v2) {
      v4 ^= 1, v1 ^= 1, v2 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x, y + 1);
      vec[2].emplace_back(x + 1, y + 1);
    }
  } else if (cntt == 2) {
    if (v1 && v2) {
      v1 ^= 1, v2 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x, y + 1);
    } else if (v1 && v3) {
      v1 ^= 1, v2 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x, y + 1);
    } else if (v2 && v4) {
      v4 ^= 1, v2 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x + 1, y + 1);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x, y + 1);
    } else if (v3 && v4) {
      v4 ^= 1, v2 ^= 1, v3 ^= 1;
      vec[0].emplace_back(x + 1, y + 1);
      vec[1].emplace_back(x + 1, y);
      vec[2].emplace_back(x, y + 1);
    } else if (v1 && v4) {
      v3 ^= 1, v1 ^= 1, v2 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x, y + 1);
      vec[2].emplace_back(x + 1, y);
    } else {
      v4 ^= 1, v1 ^= 1, v2 ^= 1;
      vec[0].emplace_back(x, y);
      vec[1].emplace_back(x, y + 1);
      vec[2].emplace_back(x + 1, y + 1);
    }
  } else {
    v4 ^= 1, v1 ^= 1, v3 ^= 1;
    vec[0].emplace_back(x, y);
    vec[1].emplace_back(x + 1, y);
    vec[2].emplace_back(x + 1, y + 1);
  }
  return false;
}
void solve() {
  for (int i = 1; i <= n; i += 2) {
    if (i == n) {
      --i;
    }
    for (int j = 1; j <= m - 2; ++j) {
      ctr(i, j);
    }
  }
  for (int i = 1; i <= n - 2; ++i) {
    ctd(i, m - 1);
  }
  while (!final_solve(n - 1, m - 1))
    ;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) assert(!mm[i][j]);
  int ans = vec[0].size();
  printf("%d\n", ans);
  for (int i = 0; i <= ans - 1; ++i) {
    printf("%d %d %d %d %d %d\n", vec[0][i].first, vec[0][i].second,
           vec[1][i].first, vec[1][i].second, vec[2][i].first,
           vec[2][i].second);
  }
}
int main() {
  int T = read();
  while (T--) {
    init();
    solve();
  }
  return 0;
}
