#include <bits/stdc++.h>
using namespace std;
template <class T>
void mini(T& a, T b) {
  a = min(a, b);
}
template <class T>
void maxi(T& a, T b) {
  a = max(a, b);
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> a) {
  return out << a.first << " " << a.second;
}
template <class T>
ostream& operator<<(ostream& out, vector<T> a) {
  for (auto& i : a) out << i << " ";
  return out;
}
template <class T>
ostream& operator<<(ostream& out, set<T> a) {
  for (auto& i : a) out << i << " ";
  return out;
}
template <class T>
ostream& operator<<(ostream& out, multiset<T> a) {
  for (auto& i : a) out << i << " ";
  return out;
}
template <class T1, class T2>
ostream& operator<<(ostream& out, map<T1, T2> a) {
  for (auto& i : a) out << i << "\n";
  return out;
}
template <class T1, class T2>
ostream& operator<<(ostream& out, unordered_map<T1, T2> a) {
  for (auto& i : a) out << i << "\n";
  return out;
}
template <class T>
ostream& operator<<(ostream& out, queue<T> a) {
  while (!a.empty()) {
    out << a.front() << " ";
    a.pop();
  }
  return out;
}
template <class T>
ostream& operator<<(ostream& out, deque<T> a) {
  while (!a.empty()) {
    out << a.front() << " ";
    a.pop_front();
  }
  return out;
}
template <class T>
ostream& operator<<(ostream& out, priority_queue<T> a) {
  while (!a.empty()) {
    out << a.top() << "\n";
    a.pop();
  }
  return out;
}
template <class T>
void out(T a) {
  cout << a << endl;
}
template <class T1, class T2>
void out(T1 a, T2 b) {
  cout << a << " " << b << endl;
}
template <class T1, class T2, class T3>
void out(T1 a, T2 b, T3 c) {
  cout << a << " " << b << " " << c << endl;
}
template <class T1, class T2, class T3, class T4>
void out(T1 a, T2 b, T3 c, T4 d) {
  cout << a << " " << b << " " << c << " " << d << endl;
}
template <class T>
void out(vector<vector<T>> a) {
  for (vector<T> i : a) out(i);
}
void out() { cout << "OK" << endl; }
template <class T>
void sort(vector<T>& a) {
  sort(a.begin(), a.end());
}
template <class T>
void uniq(vector<T>& a) {
  sort(a);
  a.erase(unique(a.begin(), a.end()), a.end());
}
template <class T>
vector<T> set_int(vector<T> a, vector<T> b) {
  sort(a);
  sort(b);
  vector<T> res;
  set_intersection(a.begin(), a.end(), b.begin(), b.end(), back_inserter(res));
  return res;
}
clock_t start_time;
double get_time() { return (double)(clock() - start_time) / CLOCKS_PER_SEC; }
istream& operator>>(istream& in, __int128& a) {
  int64_t b;
  cin >> b;
  a = b;
  return in;
}
ostream& operator<<(ostream& out, const __int128 a) {
  unsigned __int128 b = a < 0 ? -a : a;
  char buf[128];
  char* c = end(buf);
  do {
    --c;
    *c = "0123456789"[b % 10];
    b /= 10;
  } while (b);
  if (a < 0) {
    --c;
    *c = '-';
  }
  int len = end(buf) - c;
  out.rdbuf()->sputn(c, len);
  return out;
}
const int N = 105;
int a[N][N];
vector<int> kek;
void ask(int x1, int y1, int x2, int y2, int x3, int y3) {
  kek.push_back(x1);
  kek.push_back(y1);
  kek.push_back(x2);
  kek.push_back(y2);
  kek.push_back(x3);
  kek.push_back(y3);
  a[x1][y1] ^= 1;
  a[x2][y2] ^= 1;
  a[x3][y3] ^= 1;
}
void ask(vector<pair<int, int>> b) {
  ask(b[0].first, b[0].second, b[1].first, b[1].second, b[2].first,
      b[2].second);
}
void ans() {
  cout << kek.size() / 6 << "\n";
  for (int i = 0; i <= (int)kek.size() / 6 - 1; i++) {
    for (int j = 0; j <= 5; j++) {
      cout << kek[6 * i + j] << " ";
    }
    cout << "\n";
  }
}
void Solve() {
  int T;
  cin >> T;
  while (T--) {
    kek.clear();
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
        char c;
        cin >> c;
        a[i][j] = c - '0';
      }
    }
    for (int i = 1; i <= n - 1; i++) {
      for (int j = 1; j <= m - 1; j++) {
        if (a[i][j]) {
          ask(i, j, i + 1, j, i, j + 1);
        }
      }
    }
    for (int j = 1; j <= m - 2; j++) {
      if (a[n][j]) {
        ask(n, j, n, j + 1, n - 1, j + 1);
        ask(n, j + 1, n - 1, j + 1, n, j + 2);
      }
    }
    for (int i = 1; i <= n - 2; i++) {
      if (a[i][m]) {
        ask(i, m, i + 1, m, i + 1, m - 1);
        ask(i + 1, m, i + 1, m - 1, i + 2, m);
      }
    }
    int sum = a[n][m - 1] + a[n][m] + a[n - 1][m];
    if (sum == 1) {
      vector<pair<int, int>> z;
      vector<pair<int, int>> o;
      for (int i = -1; i <= 0; i++) {
        for (int j = -1; j <= 0; j++) {
          if (a[n + i][m + j])
            o.push_back({n + i, m + j});
          else
            z.push_back({n + i, m + j});
        }
      }
      ask(vector<pair<int, int>>{o[0], z[0], z[1]});
      sum++;
    }
    if (sum == 3) {
      ask(n, m - 1, n, m, n - 1, m);
    } else if (sum == 2) {
      vector<pair<int, int>> z;
      vector<pair<int, int>> o;
      for (int i = -1; i <= 0; i++) {
        for (int j = -1; j <= 0; j++) {
          if (a[n + i][m + j])
            o.push_back({n + i, m + j});
          else
            z.push_back({n + i, m + j});
        }
      }
      ask(vector<pair<int, int>>{z[0], z[1], o[0]});
      ask(vector<pair<int, int>>{z[0], z[1], o[1]});
    }
    ans();
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  start_time = clock();
  Solve();
  return 0;
}
