#include <bits/stdc++.h>
using namespace std;
vector<vector<long long>> grid;
struct Z {
  long long x[3], y[3];
};
vector<Z> ans;
void op(Z z) {
  ans.push_back(z);
  for (long long i = 0; i < (long long)(3); ++i) {
    grid[z.x[i]][z.y[i]] = 1 - grid[z.x[i]][z.y[i]];
  }
}
char buf[111];
void solve() {
  ans.clear();
  long long n, m;
  cin >> n >> m;
  grid.assign(n, vector<long long>(m));
  for (long long i = 0; i < (long long)(n); ++i) {
    cin >> buf;
    for (long long j = 0; j < (long long)(m); ++j) grid[i][j] = buf[j] - '0';
  }
  for (long long i = 0; i < (long long)(n - 1); ++i)
    for (long long j = 0; j < (long long)(m - 1); ++j) {
      if (grid[i][j] == 0 && grid[i + 1][j] == 0) continue;
      Z z;
      long long x = 0;
      if (grid[i][j]) z.x[x] = i, z.y[x] = j, ++x;
      if (grid[i + 1][j]) z.x[x] = i + 1, z.y[x] = j, ++x;
      for (long long r : {i, i + 1}) {
        if (x == 3) break;
        z.x[x] = r;
        z.y[x] = j + 1;
        ++x;
      }
      op(z);
    }
  for (long long i = 0; i + 2 < n; ++i) {
    if (grid[i][m - 2] == 0 && grid[i][m - 1] == 0) continue;
    Z z;
    long long x = 0;
    for (long long r : {i, i + 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c] == 1) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        }
      }
    }
    if (x == 0) continue;
    if (x == 3) {
      op(z);
      continue;
    }
    {
      for (long long r : {i + 1}) {
        for (long long c : {m - 2, m - 1}) {
          if (x == 3) break;
          if (grid[r][c] == 0) {
            z.x[x] = r;
            z.y[x] = c;
            ++x;
          }
        }
      }
      op(z);
    }
  }
  long long cnt = 0;
  for (long long r : {n - 2, n - 1}) {
    for (long long c : {m - 2, m - 1}) {
      if (grid[r][c]) ++cnt;
    }
  }
  if (cnt == 3) {
    Z z;
    long long x = 0;
    for (long long r : {n - 2, n - 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c]) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        }
      }
    }
    assert(x == 3);
    op(z);
  } else if (cnt == 2) {
    Z z;
    long long x = 0;
    bool asdf = false;
    for (long long r : {n - 2, n - 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c] == 0) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        } else if (!asdf) {
          asdf = true;
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        }
      }
    }
    assert(x == 3);
    op(z);
    x = 0;
    for (long long r : {n - 2, n - 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c]) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        }
      }
    }
    assert(x == 3);
    op(z);
  } else if (cnt == 1) {
    Z z;
    long long x = 0;
    long long oc = 0;
    for (long long r : {n - 2, n - 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c] == 1) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        } else if (oc < 2) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
          ++oc;
        }
      }
    }
    assert(x == 3);
    op(z);
    x = 0;
    bool asdf = false;
    for (long long r : {n - 2, n - 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c] == 0) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        } else if (!asdf) {
          asdf = true;
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        }
      }
    }
    assert(x == 3);
    op(z);
    x = 0;
    for (long long r : {n - 2, n - 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c]) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        }
      }
    }
    assert(x == 3);
    op(z);
  } else if (cnt == 4) {
    op({n - 2, n - 2, n - 1, m - 2, m - 1, m - 2});
    Z z;
    long long x = 0;
    long long oc = 0;
    for (long long r : {n - 2, n - 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c] == 1) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        } else if (oc < 2) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
          ++oc;
        }
      }
    }
    assert(x == 3);
    op(z);
    x = 0;
    bool asdf = false;
    for (long long r : {n - 2, n - 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c] == 0) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        } else if (!asdf) {
          asdf = true;
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        }
      }
    }
    assert(x == 3);
    op(z);
    x = 0;
    for (long long r : {n - 2, n - 1}) {
      for (long long c : {m - 2, m - 1}) {
        if (grid[r][c]) {
          z.x[x] = r;
          z.y[x] = c;
          ++x;
        }
      }
    }
    assert(x == 3);
    op(z);
  }
  cout << ans.size() << '\n';
  for (auto& z : ans) {
    for (long long i = 0; i < (long long)(3); ++i) {
      cout << z.x[i] + 1 << ' ' << z.y[i] + 1 << ' ';
    }
    cout << '\n';
  }
  for (long long i = 0; i < (long long)(n); ++i) {
    for (long long j = 0; j < (long long)(m); ++j) assert(grid[i][j] == 0);
  }
}
signed main(void) {
  cin.tie(0)->sync_with_stdio(false);
  signed T = 1;
  cin >> T;
  for (long long i = 1; i <= T; ++i) {
    solve();
  }
  return 0;
}
