#include <bits/stdc++.h>
using namespace std;
char s[105][105];
struct node {
  int x1, y1;
  int x2, y2;
  int x3, y3;
};
vector<node> ans;
int X1, X2, Y1, Y2;
node solve(int a, int b, int c) {
  node res;
  if (a == 1) {
    res.x1 = X1;
    res.y1 = Y1;
    s[res.x1][res.y1] = s[res.x1][res.y1] - '0' ? '0' : '1';
  }
  if (a == 2) {
    res.x1 = X1;
    res.y1 = Y2;
    s[res.x1][res.y1] = s[res.x1][res.y1] - '0' ? '0' : '1';
  }
  if (a == 3) {
    res.x1 = X2;
    res.y1 = Y1;
    s[res.x1][res.y1] = s[res.x1][res.y1] - '0' ? '0' : '1';
  }
  if (a == 4) {
    res.x1 = X2;
    res.y1 = Y2;
    s[res.x1][res.y1] = s[res.x1][res.y1] - '0' ? '0' : '1';
  }
  if (b == 1) {
    res.x2 = X1;
    res.y2 = Y1;
    s[res.x2][res.y2] = s[res.x2][res.y2] - '0' ? '0' : '1';
  }
  if (b == 2) {
    res.x2 = X1;
    res.y2 = Y2;
    s[res.x2][res.y2] = s[res.x2][res.y2] - '0' ? '0' : '1';
  }
  if (b == 3) {
    res.x2 = X2;
    res.y2 = Y1;
    s[res.x2][res.y2] = s[res.x2][res.y2] - '0' ? '0' : '1';
  }
  if (b == 4) {
    res.x2 = X2;
    res.y2 = Y2;
    s[res.x2][res.y2] = s[res.x2][res.y2] - '0' ? '0' : '1';
  }
  if (c == 1) {
    res.x3 = X1;
    res.y3 = Y1;
    s[res.x3][res.y3] = s[res.x3][res.y3] - '0' ? '0' : '1';
  }
  if (c == 2) {
    res.x3 = X1;
    res.y3 = Y2;
    s[res.x3][res.y3] = s[res.x3][res.y3] - '0' ? '0' : '1';
  }
  if (c == 3) {
    res.x3 = X2;
    res.y3 = Y1;
    s[res.x3][res.y3] = s[res.x3][res.y3] - '0' ? '0' : '1';
  }
  if (c == 4) {
    res.x3 = X2;
    res.y3 = Y2;
    s[res.x3][res.y3] = s[res.x3][res.y3] - '0' ? '0' : '1';
  }
  return res;
}
void op(int x1, int x2, int y1, int y2) {
  X1 = x1;
  X2 = x2;
  Y1 = y1;
  Y2 = y2;
  int a = s[x1][y1] - '0';
  int b = s[x1][y2] - '0';
  int c = s[x2][y1] - '0';
  int d = s[x2][y2] - '0';
  int st = a * 8 + b * 4 + c * 2 + d * 1;
  node tmp;
  if (st == 0) {
    return;
  }
  if (st == 1) {
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
    tmp = solve(1, 2, 4);
    ans.push_back(tmp);
  }
  if (st == 2) {
    tmp = solve(1, 2, 3);
    ans.push_back(tmp);
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 3) {
    tmp = solve(1, 2, 3);
    ans.push_back(tmp);
    tmp = solve(1, 2, 4);
    ans.push_back(tmp);
  }
  if (st == 4) {
    tmp = solve(1, 2, 4);
    ans.push_back(tmp);
    tmp = solve(1, 2, 3);
    ans.push_back(tmp);
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 5) {
    tmp = solve(1, 2, 3);
    ans.push_back(tmp);
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 6) {
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
    tmp = solve(1, 2, 4);
    ans.push_back(tmp);
  }
  if (st == 7) {
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 8) {
    tmp = solve(1, 2, 4);
    ans.push_back(tmp);
    tmp = solve(1, 2, 3);
    ans.push_back(tmp);
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 9) {
    tmp = solve(1, 2, 3);
    ans.push_back(tmp);
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 10) {
    tmp = solve(1, 2, 4);
    ans.push_back(tmp);
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 11) {
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 12) {
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 13) {
    tmp = solve(1, 2, 4);
    ans.push_back(tmp);
  }
  if (st == 14) {
    tmp = solve(1, 2, 3);
    ans.push_back(tmp);
  }
  if (st == 15) {
    tmp = solve(1, 2, 3);
    ans.push_back(tmp);
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
    tmp = solve(1, 2, 4);
    ans.push_back(tmp);
  }
  return;
}
void ezsolvex(int x1, int x2, int y1, int y2) {
  X1 = x1;
  X2 = x2;
  Y1 = y1;
  Y2 = y2;
  int a = s[x1][y1] - '0';
  int b = s[x1][y2] - '0';
  int st = a * 2 + b * 1;
  node tmp;
  if (st == 0) {
    return;
  }
  if (st == 1) {
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 2) {
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 3) {
    tmp = solve(1, 2, 3);
    ans.push_back(tmp);
  }
}
void ezsolvey(int x1, int x2, int y1, int y2) {
  X1 = x1;
  X2 = x2;
  Y1 = y1;
  Y2 = y2;
  int a = s[x1][y1] - '0';
  int b = s[x2][y1] - '0';
  int st = a * 2 + b * 1;
  node tmp;
  if (st == 0) {
    return;
  }
  if (st == 1) {
    tmp = solve(2, 3, 4);
    ans.push_back(tmp);
  }
  if (st == 2) {
    tmp = solve(1, 2, 4);
    ans.push_back(tmp);
  }
  if (st == 3) {
    tmp = solve(1, 3, 4);
    ans.push_back(tmp);
  }
}
int main() {
  int T;
  cin >> T;
  int n, m;
  while (T--) {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
      scanf("%s", s[i] + 1);
    }
    ans.clear();
    int l = 1;
    int u = 1;
    if (m & 1) {
      for (int i = 1; i <= n; i += 2) {
        if (i + 1 == n + 1) i--;
        ezsolvey(i, i + 1, 1, 2);
      }
      u = 2;
    }
    if (n & 1) {
      for (int i = u; i <= m; i += 2) {
        if (i + 1 == m + 1) i--;
        ezsolvex(1, 2, i, i + 1);
      }
      l = 2;
    }
    for (int i = l; i <= n; i += 2) {
      for (int j = u; j <= m; j += 2) {
        op(i, i + 1, j, j + 1);
      }
    }
    int len = ans.size();
    printf("%d\n", ans.size());
    for (int i = 0; i < len; i++) {
      printf("%d %d %d %d %d %d\n", ans[i].x1, ans[i].y1, ans[i].x2, ans[i].y2,
             ans[i].x3, ans[i].y3);
    }
  }
}
