#include <bits/stdc++.h>
using namespace std;
const long long inf = 0x3f3f3f3f;
char x[120][120];
struct node {
  int x;
  int y;
};
node no1[5];
node no0[5];
queue<node> ex;
void judge(int cnt1) {
  node t1;
  if (cnt1 == 0) {
    return;
  } else if (cnt1 == 1) {
    for (int i = 1; i <= 2; i++) {
      for (int j = i + 1; j <= 3; j++) {
        t1.x = no1[1].x;
        t1.y = no1[1].y;
        ex.push(t1);
        t1.x = no0[i].x;
        t1.y = no0[i].y;
        ex.push(t1);
        t1.x = no0[j].x;
        t1.y = no0[j].y;
        ex.push(t1);
      }
    }
  } else if (cnt1 == 2) {
    for (int i = 1; i <= 2; i++) {
      t1.x = no1[i].x;
      t1.y = no1[i].y;
      ex.push(t1);
      t1.x = no0[1].x;
      t1.y = no0[1].y;
      ex.push(t1);
      t1.x = no0[2].x;
      t1.y = no0[2].y;
      ex.push(t1);
    }
  } else if (cnt1 == 3) {
    t1.x = no1[1].x;
    t1.y = no1[1].y;
    ex.push(t1);
    t1.x = no1[2].x;
    t1.y = no1[2].y;
    ex.push(t1);
    t1.x = no1[3].x;
    t1.y = no1[3].y;
    ex.push(t1);
  } else if (cnt1 == 4) {
    for (int i = 1; i <= 2; i++) {
      for (int j = i + 1; j <= 3; j++) {
        for (int k = j + 1; k <= 4; k++) {
          t1.x = no1[i].x;
          t1.y = no1[i].y;
          ex.push(t1);
          t1.x = no1[j].x;
          t1.y = no1[j].y;
          ex.push(t1);
          t1.x = no1[k].x;
          t1.y = no1[k].y;
          ex.push(t1);
        }
      }
    }
  }
}
int main() {
  int t;
  cin >> t;
  while (t--) {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
      scanf("%s", x[i] + 1);
    }
    int cnt0 = 0;
    int cnt1 = 0;
    node t1;
    if (n % 2 == 1 || m % 2 == 1) {
      if (x[n][m] == '1') {
        t1.x = n;
        t1.y = m;
        ex.push(t1);
        t1.x = n - 1;
        t1.y = m - 1;
        ex.push(t1);
        if (x[n - 1][m - 1] == '0')
          x[n - 1][m - 1] = '1';
        else
          x[n - 1][m - 1] = '0';
        t1.x = n;
        t1.y = m - 1;
        ex.push(t1);
        if (x[n][m - 1] == '0')
          x[n][m - 1] = '1';
        else
          x[n][m - 1] = '0';
      }
    }
    if (n % 2 == 1) {
      for (int i = 1; i <= m; i++) {
        if (n % 2 == 1 && i == m) continue;
        if (x[n][i] == '0') continue;
        t1.x = n;
        t1.y = i;
        ex.push(t1);
        t1.x = n - 1;
        t1.y = i;
        ex.push(t1);
        if (x[n - 1][i] == '0')
          x[n - 1][i] = '1';
        else
          x[n - 1][i] = '0';
        if (i == 1) {
          t1.x = n - 1;
          t1.y = i + 1;
          ex.push(t1);
          if (x[n - 1][i + 1] == '0')
            x[n - 1][i + 1] = '1';
          else
            x[n - 1][i + 1] = '0';
        } else {
          t1.x = n - 1;
          t1.y = i - 1;
          ex.push(t1);
          if (x[n - 1][i - 1] == '0')
            x[n - 1][i - 1] = '1';
          else
            x[n - 1][i - 1] = '0';
        }
      }
    }
    if (m % 2 == 1) {
      for (int i = 1; i <= n; i++) {
        if (m % 2 == 1 && i == n) continue;
        if (x[i][m] == '0') continue;
        t1.x = i;
        t1.y = m;
        ex.push(t1);
        t1.x = i;
        t1.y = m - 1;
        ex.push(t1);
        if (x[i][m - 1] == '0')
          x[i][m - 1] = '1';
        else
          x[i][m - 1] = '0';
        if (i == 1) {
          t1.x = i + 1;
          t1.y = m - 1;
          ex.push(t1);
          if (x[i + 1][m - 1] == '0')
            x[i + 1][m - 1] = '1';
          else
            x[i + 1][m - 1] = '0';
        } else {
          t1.x = i - 1;
          t1.y = m - 1;
          ex.push(t1);
          if (x[i - 1][m - 1] == '0')
            x[i - 1][m - 1] = '1';
          else
            x[i - 1][m - 1] = '0';
        }
      }
    }
    if (n % 2 == 1) n--;
    if (m % 2 == 1) m--;
    for (int i = 1; i <= 2; i++) {
      for (int j = 1; j <= 2; j++) {
        if (x[i][j] == '1') {
          no1[++cnt1].x = i;
          no1[cnt1].y = j;
        } else {
          no0[++cnt0].x = i;
          no0[cnt0].y = j;
        }
      }
    }
    judge(cnt1);
    for (int i = 1; i <= n; i += 2) {
      for (int j = 1; j <= m; j += 2) {
        if (i == 1 && j == 1) continue;
        cnt0 = 0;
        cnt1 = 0;
        for (int l = i; l <= i + 1; l++) {
          for (int r = j; r <= j + 1; r++) {
            if (x[l][r] == '1') {
              no1[++cnt1].x = l;
              no1[cnt1].y = r;
            } else {
              no0[++cnt0].x = l;
              no0[cnt0].y = r;
            }
          }
        }
        judge(cnt1);
      }
    }
    cout << ex.size() / 3 << endl;
    while (!ex.empty()) {
      t1 = ex.front();
      ex.pop();
      printf("%d %d ", t1.x, t1.y);
      t1 = ex.front();
      ex.pop();
      printf("%d %d ", t1.x, t1.y);
      t1 = ex.front();
      ex.pop();
      printf("%d %d ", t1.x, t1.y);
    }
    cout << endl;
  }
  return 0;
}
