#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse4")
using namespace std;
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T1, class T2>
ostream& operator<<(ostream& s, pair<T1, T2> P) {
  return s << '<' << P.first << ", " << P.second << '>';
}
template <class T>
ostream& operator<<(ostream& s, vector<T> P) {
  for (int i = 0; i < P.size(); ++i) {
    if (i > 0) {
      s << " ";
    }
    s << P[i];
  }
  return s;
}
template <class T>
ostream& operator<<(ostream& s, deque<T> P) {
  for (int i = 0; i < P.size(); ++i) {
    if (i > 0) {
      s << " ";
    }
    s << P[i];
  }
  return s;
}
template <class T>
ostream& operator<<(ostream& s, vector<vector<T>> P) {
  for (int i = 0; i < P.size(); ++i) {
    s << endl << P[i];
  }
  return s << endl;
}
template <class T>
ostream& operator<<(ostream& s, set<T> P) {
  for (auto it : P) {
    s << "<" << it << "> ";
  }
  return s << endl;
}
template <class T1, class T2>
ostream& operator<<(ostream& s, map<T1, T2> P) {
  for (auto it : P) {
    s << "<" << it.first << "->" << it.second << "> ";
  }
  return s << endl;
}
void solve(vector<vector<int>> v) {
  int N = v.size(), M = v[0].size();
  vector<vector<int>> res;
  auto push = [&](int a, int b, int c, int d, int e, int f) -> void {
    res.push_back({a, b, c, d, e, f});
    v[a][b] = 1 - v[a][b], v[c][d] = 1 - v[c][d], v[e][f] = 1 - v[e][f];
  };
  for (int i = 0; i + 2 < N; ++i) {
    for (int j = 0; j < M; ++j) {
      if (v[i][j] == 0) continue;
      if (j == M - 1)
        push(i, j, i + 1, j - 1, i + 1, j);
      else {
        if (v[i][j + 1] == 1)
          push(i, j, i, j + 1, i + 1, j);
        else
          push(i, j, i + 1, j, i + 1, j + 1);
      }
    }
  }
  {
    int i = N - 2;
    for (int j = 0; j < M - 2; ++j) {
      if (v[i][j] == 1 && v[i + 1][j] == 1)
        push(i, j, i + 1, j, i, j + 1);
      else if (v[i][j] == 1 && v[i + 1][j] == 0)
        push(i, j, i, j + 1, i + 1, j + 1);
      else if (v[i][j] == 0 && v[i + 1][j] == 1)
        push(i + 1, j, i, j + 1, i + 1, j + 1);
    }
  }
  int i = N - 2, j = M - 2;
  int num = 0;
  for (int k = 0; k < 2; ++k) {
    for (int l = 0; l < 2; ++l) {
      if (v[i + k][j + l] == 1) ++num;
    }
  }
  auto v2 = v;
  for (int k = 0; k < 2; ++k) {
    for (int l = 0; l < 2; ++l) {
      if (num % 2 == 0) {
        if (v2[i + k][j + l] == 1) {
          vector<int> tmp;
          for (int k2 = 0; k2 < 2; ++k2) {
            for (int l2 = 0; l2 < 2; ++l2) {
              if (k == k2 && l == l2) continue;
              tmp.push_back(i + k2), tmp.push_back(j + l2);
            }
          }
          push(tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5]);
        }
      } else {
        if (v2[i + k][j + l] == 0) {
          vector<int> tmp;
          for (int k2 = 0; k2 < 2; ++k2) {
            for (int l2 = 0; l2 < 2; ++l2) {
              if (k == k2 && l == l2) continue;
              tmp.push_back(i + k2), tmp.push_back(j + l2);
            }
          }
          push(tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5]);
        }
      }
    }
  }
  cout << res.size() << endl;
  for (auto v : res) {
    for (int i = 0; i < 6; ++i) {
      if (i) cout << " ";
      cout << v[i] + 1;
    }
    cout << endl;
  }
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int T;
  cin >> T;
  while (T--) {
    int N, M;
    cin >> N >> M;
    vector<string> fi(N);
    for (int i = 0; i < N; ++i) cin >> fi[i];
    vector<vector<int>> v(N, vector<int>(M, 0));
    for (int i = 0; i < N; ++i)
      for (int j = 0; j < M; ++j) v[i][j] = (int)fi[i][j] - '0';
    solve(v);
  }
}
