#include <bits/stdc++.h>
using namespace std;
struct node {
  int x1, x2, x3, y1, y2, y3;
  node() {}
  node(int x1, int y1, int x2, int y2, int x3, int y3)
      : x1(x1), y1(y1), x2(x2), y2(y2), x3(x3), y3(y3) {}
};
vector<node> v;
int a[105][105];
void moveRight(int i, int j) {
  int x0 = i, y0 = j;
  int x1 = i + 1, y1 = j;
  int x2 = i, y2 = j + 1;
  int x3 = i + 1, y3 = j + 1;
  if (a[x0][y0] == 1 && a[x1][y1] == 1) {
    v.push_back(node(x0, y0, x1, y1, x3, y3));
    a[x0][y0] = !a[x0][y0];
    a[x1][y1] = !a[x1][y1];
    a[x3][y3] = !a[x3][y3];
  } else if (a[x0][y0] == 1) {
    v.push_back(node(x0, y0, x2, y2, x3, y3));
    a[x0][y0] = !a[x0][y0];
    a[x2][y2] = !a[x2][y2];
    a[x3][y3] = !a[x3][y3];
  } else if (a[x1][y1] == 1) {
    v.push_back(node(x1, y1, x2, y2, x3, y3));
    a[x1][y1] = !a[x1][y1];
    a[x2][y2] = !a[x2][y2];
    a[x3][y3] = !a[x3][y3];
  }
}
void moveDown(int i, int j) {
  int x0 = i, y0 = j;
  int x1 = i + 1, y1 = j;
  int x2 = i, y2 = j + 1;
  int x3 = i + 1, y3 = j + 1;
  if (a[x0][y0] == 1 && a[x2][y2] == 1) {
    v.push_back(node(x0, y0, x2, y2, x3, y3));
    a[x0][y0] = !a[x0][y0];
    a[x2][y2] = !a[x2][y2];
    a[x3][y3] = !a[x3][y3];
  } else if (a[x2][y2] == 1) {
    v.push_back(node(x1, y1, x2, y2, x3, y3));
    a[x1][y1] = !a[x1][y1];
    a[x2][y2] = !a[x2][y2];
    a[x3][y3] = !a[x3][y3];
  } else if (a[x0][y0] == 1) {
    v.push_back(node(x1, y1, x0, y0, x3, y3));
    a[x1][y1] = !a[x1][y1];
    a[x0][y0] = !a[x0][y0];
    a[x3][y3] = !a[x3][y3];
  }
}
void solve(int i, int j) {
  int x0 = i, y0 = j;
  int x1 = i + 1, y1 = j;
  int x2 = i, y2 = j + 1;
  int x3 = i + 1, y3 = j + 1;
  deque<int> v0, v1;
  if (a[x0][y0] == 0) {
    v0.push_back(x0);
    v0.push_back(y0);
  } else {
    v1.push_back(x0);
    v1.push_back(y0);
  }
  if (a[x1][y1] == 0) {
    v0.push_back(x1);
    v0.push_back(y1);
  } else {
    v1.push_back(x1);
    v1.push_back(y1);
  }
  if (a[x2][y2] == 0) {
    v0.push_back(x2);
    v0.push_back(y2);
  } else {
    v1.push_back(x2);
    v1.push_back(y2);
  }
  if (a[x3][y3] == 0) {
    v0.push_back(x3);
    v0.push_back(y3);
  } else {
    v1.push_back(x3);
    v1.push_back(y3);
  }
  if (v1.size() == 2) {
    x1 = v0.front();
    v0.pop_front();
    y1 = v0.front();
    v0.pop_front();
    x2 = v0.front();
    v0.pop_front();
    y2 = v0.front();
    v0.pop_front();
    x3 = v1.front();
    v1.pop_front();
    y3 = v1.front();
    v1.pop_front();
    v.push_back(node(x1, y1, x2, y2, x3, y3));
    v1.push_back(x1);
    v1.push_back(y1);
    v1.push_back(x2);
    v1.push_back(y2);
    v0.push_back(x3);
    v0.push_back(y3);
    x1 = v0.front();
    v0.pop_front();
    y1 = v0.front();
    v0.pop_front();
    x2 = v0.front();
    v0.pop_front();
    y2 = v0.front();
    v0.pop_front();
    x3 = v1.front();
    v1.pop_front();
    y3 = v1.front();
    v1.pop_front();
    v.push_back(node(x1, y1, x2, y2, x3, y3));
    v1.push_back(x1);
    v1.push_back(y1);
    v1.push_back(x2);
    v1.push_back(y2);
    v0.push_back(x3);
    v0.push_back(y3);
    x1 = v1.front();
    v1.pop_front();
    y1 = v1.front();
    v1.pop_front();
    x2 = v1.front();
    v1.pop_front();
    y2 = v1.front();
    v1.pop_front();
    x3 = v1.front();
    v1.pop_front();
    y3 = v1.front();
    v1.pop_front();
    v.push_back(node(x1, y1, x2, y2, x3, y3));
  } else if (v1.size() == 4) {
    x1 = v0.front();
    v0.pop_front();
    y1 = v0.front();
    v0.pop_front();
    x2 = v0.front();
    v0.pop_front();
    y2 = v0.front();
    v0.pop_front();
    x3 = v1.front();
    v1.pop_front();
    y3 = v1.front();
    v1.pop_front();
    v.push_back(node(x1, y1, x2, y2, x3, y3));
    v1.push_back(x1);
    v1.push_back(y1);
    v1.push_back(x2);
    v1.push_back(y2);
    v0.push_back(x3);
    v0.push_back(y3);
    x1 = v1.front();
    v1.pop_front();
    y1 = v1.front();
    v1.pop_front();
    x2 = v1.front();
    v1.pop_front();
    y2 = v1.front();
    v1.pop_front();
    x3 = v1.front();
    v1.pop_front();
    y3 = v1.front();
    v1.pop_front();
    v.push_back(node(x1, y1, x2, y2, x3, y3));
  } else if (v1.size() == 6) {
    x1 = v1.front();
    v1.pop_front();
    y1 = v1.front();
    v1.pop_front();
    x2 = v1.front();
    v1.pop_front();
    y2 = v1.front();
    v1.pop_front();
    x3 = v1.front();
    v1.pop_front();
    y3 = v1.front();
    v1.pop_front();
    v.push_back(node(x1, y1, x2, y2, x3, y3));
  }
}
int main() {
  int t;
  cin >> t;
  while (t--) {
    int n, m;
    cin >> n >> m;
    v.clear();
    string st;
    for (int i = 0; i < n; i++) {
      cin >> st;
      for (int j = 0; j < m; j++) a[i][j] = st[j] - '0';
    }
    for (int i = 0; i < n - 1; i += 2) {
      for (int j = 0; j < m - 2; j++) {
        moveRight(i, j);
      }
    }
    if (n % 2) {
      for (int j = 0; j < m - 2; j++) {
        moveRight(n - 2, j);
      }
    }
    for (int i = 0; i < n - 1; i++) {
      moveDown(i, m - 2);
    }
    solve(n - 2, m - 2);
    cout << v.size() << endl;
    for (auto x : v) {
      cout << x.x1 + 1 << ' ' << x.y1 + 1 << ' ' << x.x2 + 1 << ' ' << x.y2 + 1
           << ' ' << x.x3 + 1 << ' ' << x.y3 + 1 << endl;
    }
  }
}
