#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  int test;
  for (cin >> test; test--;) {
    int m, n;
    cin >> m >> n;
    vector<vector<int>> s(m + 5, vector<int>(n + 5));
    for (int i = 1; i <= m; ++i) {
      for (int j = 1; j <= n; ++j) {
        char x;
        cin >> x;
        s[i][j] = x - '0';
      }
    }
    vector<int> ans;
    auto f = [&](int i, int j) {
      s[i][j] ^= 1;
      ans.push_back(i);
      ans.push_back(j);
    };
    auto fp = [&](pair<int, int> a) {
      s[a.first][a.second] ^= 1;
      ans.push_back(a.first);
      ans.push_back(a.second);
    };
    if (m > 2) {
      for (int i = 1; i <= m - 2; ++i) {
        for (int j = 1; j < n; ++j) {
          if (s[i][j] == 0) continue;
          if (s[i][j + 1] == 1) {
            if (s[i + 1][j] == 1) {
              f(i, j);
              f(i + 1, j);
              f(i, j + 1);
            } else {
              f(i, j);
              f(i, j + 1);
              f(i + 1, j + 1);
            }
          } else {
            f(i, j);
            f(i + 1, j + 1);
            f(i + 1, j);
          }
        }
        if (s[i][n] == 1) {
          f(i, n);
          f(i + 1, n);
          f(i + 1, n - 1);
        }
      }
      for (int j = 1, i = m - 1; j < n; ++j) {
        if (s[i + 1][j] == 0 && s[i][j] == 0 && (!(i == m - 1 && j == n - 1)))
          continue;
        int sum = s[i][j] + s[i][j + 1] + s[i + 1][j] + s[i + 1][j + 1];
        if (sum == 4) {
          f(i + 1, j);
          f(i + 1, j + 1);
          f(i, j + 1);
          f(i, j);
          f(i + 1, j);
          f(i, j + 1);
          f(i, j);
          f(i, j + 1);
          f(i + 1, j + 1);
          f(i, j);
          f(i + 1, j);
          f(i + 1, j + 1);
        }
        vector<pair<int, int>> e = {
            {i, j}, {i + 1, j}, {i, j + 1}, {i + 1, j + 1}};
        sort(e.begin(), e.end(), [&](pair<int, int> x, pair<int, int> y) {
          return s[x.first][x.second] < s[y.first][y.second];
        });
        if (sum == 2) {
          if (sum == 2) {
            fp(e[0]);
            fp(e[1]);
            fp(e[2]);
            fp(e[0]);
            fp(e[1]);
            fp(e[3]);
          }
          continue;
        }
        if (sum == 3) {
          if (s[i][j] == 1) f(i, j);
          if (s[i + 1][j] == 1) f(i + 1, j);
          if (s[i][j + 1] == 1) f(i, j + 1);
          if (s[i + 1][j + 1] == 1) f(i + 1, j + 1);
          continue;
        }
        if (sum == 1) {
          fp(e[1]);
          fp(e[2]);
          fp(e[3]);
          fp(e[0]);
          fp(e[1]);
          fp(e[3]);
          fp(e[0]);
          fp(e[2]);
          fp(e[3]);
        }
      }
    } else {
      for (int j = 1; j <= n - 2; ++j) {
        for (int i = 1; i < m; ++i) {
          if (s[i][j] == 0) continue;
          if (s[i + 1][j] == 1) {
            if (s[i][j + 1] == 1) {
              f(i, j);
              f(i + 1, j);
              f(i, j + 1);
            } else {
              f(i, j);
              f(i + 1, j);
              f(i + 1, j + 1);
            }
          } else {
            f(i, j);
            f(i, j + 1);
            f(i + 1, j + 1);
          }
        }
        if (s[m][j] == 1) {
          f(m, j);
          f(m - 1, j + 1);
          f(m, j + 1);
        }
      }
      for (int i = 1, j = n - 1; i < m; ++i) {
        if (s[i][j] == 0 && s[i][j + 1] == 0 && (!(i == m - 1 && j == n - 1)))
          continue;
        int sum = s[i][j] + s[i][j + 1] + s[i + 1][j] + s[i + 1][j + 1];
        if (sum == 4) {
          f(i + 1, j);
          f(i + 1, j + 1);
          f(i, j + 1);
          f(i, j);
          f(i + 1, j);
          f(i, j + 1);
          f(i, j);
          f(i, j + 1);
          f(i + 1, j + 1);
          f(i, j);
          f(i + 1, j);
          f(i + 1, j + 1);
        }
        vector<pair<int, int>> e = {
            {i, j}, {i + 1, j}, {i, j + 1}, {i + 1, j + 1}};
        sort(e.begin(), e.end(), [&](pair<int, int> x, pair<int, int> y) {
          return s[x.first][x.second] < s[y.first][y.second];
        });
        if (sum == 2) {
          if (sum == 2) {
            fp(e[0]);
            fp(e[1]);
            fp(e[2]);
            fp(e[0]);
            fp(e[1]);
            fp(e[3]);
          }
          continue;
        }
        if (sum == 3) {
          if (s[i][j] == 1) f(i, j);
          if (s[i + 1][j] == 1) f(i + 1, j);
          if (s[i][j + 1] == 1) f(i, j + 1);
          if (s[i + 1][j + 1] == 1) f(i + 1, j + 1);
          continue;
        }
        if (sum == 1) {
          fp(e[1]);
          fp(e[2]);
          fp(e[3]);
          fp(e[0]);
          fp(e[1]);
          fp(e[3]);
          fp(e[0]);
          fp(e[2]);
          fp(e[3]);
        }
      }
    }
    cout << ans.size() / 6 << '\n';
    for (int i = 0; i < ans.size(); i += 6) {
      cout << ans[i] << ' ' << ans[i + 1] << ' ' << ans[i + 2] << ' '
           << ans[i + 3] << ' ' << ans[i + 4] << ' ' << ans[i + 5] << '\n';
    }
  }
}
