#include <bits/stdc++.h>
const int N = 105;
int n, m;
char a[N][N];
struct Node {
  int ax, ay, bx, by, cx, cy;
};
void work(int i, int j, int mask) {
  for (int x = 0; x < 2; ++x) {
    for (int y = 0; y < 2; ++y) {
      if (mask >> (x << 1 | y) & 1) {
        a[i][j] ^= 1, a[i][j + 1] ^= 1, a[i + 1][j] ^= 1, a[i + 1][j + 1] ^= 1;
        a[i + x][j + y] ^= 1;
      }
    }
  }
}
void solve() {
  std::cin >> n >> m;
  for (int i = 0; i < n; ++i) {
    std::cin >> a[i];
  }
  std::vector<Node> ans;
  if ((n & 1) && (m & 1) && a[n - 1][m - 1] == '1') {
    ans.push_back({n - 1, m - 1, n - 2, m - 1, n - 1, m - 2});
    a[n - 1][m - 1] = '0';
    a[n - 2][m - 1] ^= 1;
    a[n - 1][m - 2] ^= 1;
  }
  if (m & 1) {
    for (int i = 0; i < n - 1; i += 2) {
      if (a[i][m - 1] == '1' && a[i + 1][m - 1] == '1') {
        ans.push_back({i, m - 2, i, m - 1, i + 1, m - 1});
        a[i][m - 2] ^= 1;
      } else if (a[i][m - 1] == '1') {
        ans.push_back({i, m - 2, i + 1, m - 2, i + 1, m - 1});
        ans.push_back({i, m - 2, i, m - 1, i + 1, m - 1});
        a[i + 1][m - 2] ^= 1;
      } else if (a[i + 1][m - 1] == '1') {
        ans.push_back({i, m - 2, i + 1, m - 2, i, m - 1});
        ans.push_back({i, m - 2, i, m - 1, i + 1, m - 1});
        a[i + 1][m - 2] ^= 1;
      }
    }
    --m;
  }
  if (n & 1) {
    for (int i = 0; i < m - 1; i += 2) {
      if (a[n - 1][i] == '1' && a[n - 1][i + 1] == '1') {
        ans.push_back({n - 2, i, n - 1, i, n - 1, i + 1});
        a[n - 2][i] ^= 1;
      } else if (a[n - 1][i] == '1') {
        ans.push_back({n - 2, i, n - 2, i + 1, n - 1, i + 1});
        ans.push_back({n - 2, i, n - 1, i, n - 1, i + 1});
        a[n - 2][i + 1] ^= 1;
      } else if (a[n - 1][i + 1] == '1') {
        ans.push_back({n - 2, i, n - 2, i + 1, n - 1, i});
        ans.push_back({n - 2, i, n - 1, i, n - 1, i + 1});
        a[n - 2][i + 1] ^= 1;
      }
    }
    --n;
  }
  for (int i = 0; i < n; i += 2) {
    for (int j = 0; j < m; j += 2) {
      for (int k = 0; k < 16; ++k) {
        work(i, j, k);
        if (a[i][j] == '0' && a[i][j + 1] == '0' && a[i + 1][j] == '0' &&
            a[i + 1][j + 1] == '0') {
          for (int x = 0; x < 2; ++x) {
            for (int y = 0; y < 2; ++y) {
              if (k >> (x << 1 | y) & 1) {
                std::vector<int> p;
                for (int dx = 0; dx < 2; ++dx) {
                  for (int dy = 0; dy < 2; ++dy) {
                    if (x != dx || y != dy) {
                      p.push_back(i + dx);
                      p.push_back(j + dy);
                    }
                  }
                }
                ans.push_back({p[0], p[1], p[2], p[3], p[4], p[5]});
              }
            }
          }
          break;
        }
        work(i, j, k);
      }
    }
  }
  std::cout << ans.size() << "\n";
  for (auto v : ans) {
    std::cout << v.ax + 1 << " " << v.ay + 1 << " ";
    std::cout << v.bx + 1 << " " << v.by + 1 << " ";
    std::cout << v.cx + 1 << " " << v.cy + 1 << "\n";
  }
}
int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(0);
  int T = 1;
  std::cin >> T;
  while (T--) {
    solve();
  }
}
