#include <bits/stdc++.h>
using namespace std;
void __print(int x) { cerr << x; }
void __print(long x) { cerr << x; }
void __print(long long x) { cerr << x; }
void __print(unsigned x) { cerr << x; }
void __print(unsigned long x) { cerr << x; }
void __print(unsigned long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }
template <typename T, typename V>
void __print(const pair<T, V> &x) {
  cerr << '{';
  __print(x.first);
  cerr << ',';
  __print(x.second);
  cerr << '}';
}
template <typename T>
void __print(const T &x) {
  int f = 0;
  cerr << '{';
  for (auto &i : x) cerr << (f++ ? "," : ""), __print(i);
  cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V>
void _print(T t, V... v) {
  __print(t);
  if (sizeof...(v)) cerr << ", ";
  _print(v...);
}
clock_t start = clock();
int gcd(int a, int b) { return (a == 0) ? b : gcd(b % a, a); }
int power(int a, int n) {
  int p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
    }
    n >>= 1;
    a *= a;
  }
  return p;
}
int powm(int a, int n, int mod_) {
  int p = 1;
  while (n) {
    if (n % 2) {
      p = (((p % mod_) * 1LL * (a % mod_)) % mod_);
    }
    n >>= 1;
    a = (((a % mod_) * 1LL * (a % mod_)) % mod_);
  }
  return p % mod_;
}
int powi(int a, int mod_) { return powm(a, mod_ - 2, mod_); }
std::vector<std::vector<pair<int, int>>> ans;
vector<vector<int>> a;
void three(int i, int j) {
  vector<pair<int, int>> v;
  int l, r;
  for (l = 1; l >= 0; --l) {
    for (r = 1; r >= 0; --r) {
      if (a[i + l][j + r]) {
        v.push_back({i + l, j + r});
        a[i + l][j + r] = 0;
      }
    }
  }
  ans.push_back(v);
}
void two(int i, int j) {
  vector<pair<int, int>> v;
  int l, r;
  int cnt = 0;
  for (l = 1; l >= 0; --l) {
    for (r = 1; r >= 0; --r) {
      if (a[i + l][j + r]) {
        ++cnt;
        v.push_back({i + l, j + r});
        a[i + l][j + r] = 0;
        break;
      }
    }
    if (cnt) break;
  }
  cnt = 0;
  for (l = 1; l >= 0; --l) {
    for (r = 1; r >= 0; --r) {
      if (make_pair(i + l, j + r) != v[0] and a[i + l][j + r] == 0) {
        ++cnt;
        v.push_back({i + l, j + r});
        a[i + l][j + r] = 1;
      }
      if (cnt == 2) break;
    }
    if (cnt == 2) break;
  }
  ans.push_back(v);
  three(i, j);
}
void one(int i, int j) {
  vector<pair<int, int>> v;
  int l, r;
  int cnt = 0;
  for (l = 1; l >= 0; --l) {
    for (r = 1; r >= 0; --r) {
      if (a[i + l][j + r]) {
        v.push_back({i + l, j + r});
        a[i + l][j + r] = 0;
        ++cnt;
        break;
      }
    }
    if (cnt) break;
  }
  cnt = 0;
  for (l = 1; l >= 0; --l) {
    for (r = 1; r >= 0; --r) {
      if (make_pair(i + l, j + r) != v[0]) {
        ++cnt;
        v.push_back({i + l, j + r});
        a[i + l][j + r] = 1;
      }
      if (cnt == 2) break;
    }
    if (cnt == 2) break;
  }
  ans.push_back(v);
  two(i, j);
}
void four(int i, int j) {
  vector<pair<int, int>> v;
  v.push_back({i + 1, j + 1});
  v.push_back({i, j + 1});
  v.push_back({i + 1, j});
  a[i + 1][j + 1] = a[i + 1][j] = a[i][j + 1] = 0;
  ans.push_back(v);
  one(i, j);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int mn, mx;
  int n, m, k, t, i, j, sum = 0, flag = 0, cnt = 0;
  int x = 0, y = 0, z, l = 0, r = 0, q;
  int TC = 1, tc = 0;
  cin >> TC;
  while (tc++ < TC) {
    cin >> n >> m;
    a.assign(n, vector<int>(m));
    string s;
    for (i = 0; i < n; ++i) {
      cin >> s;
      for (j = 0; j < m; ++j) a[i][j] = s[j] - '0';
    }
    ans.clear();
    if (n % 2 and m % 2 and a[n - 1][m - 1] == 1) {
      vector<pair<int, int>> v;
      i = n - 2;
      j = m - 2;
      v.push_back({i + 1, j + 1});
      v.push_back({i, j + 1});
      v.push_back({i + 1, j});
      a[i + 1][j + 1] ^= 1;
      a[i + 1][j] ^= 1;
      a[i][j + 1] ^= 1;
      ans.push_back(v);
    }
    if (n % 2) {
      for (j = 0; j < m - 1; j += 2) {
        cnt = 0;
        i = n - 2;
        vector<pair<int, int>> v;
        if (a[n - 1][j]) {
          v.push_back({n - 1, j});
          ++cnt;
          a[n - 1][j] = 0;
        }
        if (a[n - 1][j + 1]) {
          v.push_back({n - 1, j + 1});
          ++cnt;
          a[n - 1][j + 1] = 0;
        }
        if (cnt == 0) continue;
        v.push_back({n - 2, j});
        ++cnt;
        a[n - 2][j] ^= 1;
        if (cnt < 3) {
          v.push_back({n - 2, j + 1});
          ++cnt;
          a[n - 2][j + 1] ^= 1;
        }
        ans.push_back(v);
      }
    }
    if (m % 2) {
      for (i = 0; i < n - 1; i += 2) {
        cnt = 0;
        j = m - 2;
        vector<pair<int, int>> v;
        if (a[i][m - 1]) {
          v.push_back({i, m - 1});
          ++cnt;
          a[i][m - 1] = 0;
        }
        if (a[i + 1][m - 1]) {
          v.push_back({i + 1, m - 1});
          ++cnt;
          a[i + 1][m - 1] = 0;
        }
        if (cnt == 0) continue;
        v.push_back({i, m - 2});
        ++cnt;
        a[i][m - 2] ^= 1;
        if (cnt < 3) {
          v.push_back({i + 1, m - 2});
          ++cnt;
          a[i + 1][m - 2] ^= 1;
        }
        ans.push_back(v);
      }
    }
    for (i = 0; i < n - 1; i += 2) {
      for (j = 0; j < m - 1; j += 2) {
        cnt = 0;
        for (l = 0; l < 2; ++l) {
          for (r = 0; r < 2; ++r) {
            if (a[i + l][j + r]) ++cnt;
          }
        }
        if (cnt == 4) four(i, j);
        if (cnt == 3) three(i, j);
        if (cnt == 2) two(i, j);
        if (cnt == 1) one(i, j);
      }
    }
    cout << (int)((ans).size()) << '\n';
    for (i = 0; i < (int)((ans).size()); ++i) {
      for (j = 0; j < 3; ++j) {
        cout << ans[i][j].first + 1 << ' ' << ans[i][j].second + 1 << ' ';
      }
      cout << '\n';
    }
  };
  return 0;
}
