#include <bits/stdc++.h>
using namespace std;
int g[105][105];
int res = 0;
struct T {
  int x1, y1;
  int x2, y2;
  int x3, y3;
} T[40005];
int solve(int x, int y) {
  int num = 0;
  if (g[x][y] == 1) num++;
  if (g[x + 1][y] == 1) num++;
  if (g[x][y + 1] == 1) num++;
  if (g[x + 1][y + 1] == 1) num++;
  if (num == 0) return 0;
  if (num == 4) {
    T[++res].x1 = x, T[res].y1 = y;
    T[res].x2 = x + 1, T[res].y2 = y;
    T[res].x3 = x, T[res].y3 = y + 1;
    g[x][y] = g[x + 1][y] = g[x][y + 1] = 0;
    num = 1;
  }
  if (num == 1) {
    int flag = 0;
    res++;
    for (int i = x; i <= x + 1; i++) {
      for (int j = y; j <= y + 1; j++) {
        if (g[i][j] == 1) {
          T[res].x1 = i;
          T[res].y1 = j;
          g[i][j] = 0;
        } else if (g[i][j] == 0 && flag < 2) {
          if (flag == 0) {
            T[res].x2 = i;
            T[res].y2 = j;
            flag++;
            g[i][j] = 1;
          } else if (flag == 1) {
            T[res].x3 = i;
            T[res].y3 = j;
            flag++;
            g[i][j] = 1;
          }
        }
      }
    }
    num = 2;
  }
  if (num == 2) {
    int flag1 = 0, flag2 = 0;
    res++;
    for (int i = x; i <= x + 1; i++) {
      for (int j = y; j <= y + 1; j++) {
        if (g[i][j] == 0 && flag1 < 2) {
          if (flag1 == 0) {
            T[res].x1 = i;
            T[res].y1 = j;
            g[i][j] = 1;
            flag1++;
          } else if (flag1 == 1) {
            T[res].x2 = i;
            T[res].y2 = j;
            g[i][j] = 1;
            flag1++;
          }
        } else if (g[i][j] == 1 && flag2 == 0) {
          T[res].x3 = i;
          T[res].y3 = j;
          flag2 = 1;
          g[i][j] = 0;
        }
      }
    }
    num = 3;
  }
  if (num == 3) {
    res++;
    int flag = 0;
    for (int i = x; i <= x + 1; i++) {
      for (int j = y; j <= y + 1; j++) {
        if (g[i][j] == 1) {
          if (flag == 0) {
            T[res].x1 = i;
            T[res].y1 = j;
            g[i][j] = 0;
            flag++;
          } else if (flag == 1) {
            T[res].x2 = i;
            T[res].y2 = j;
            g[i][j] = 0;
            flag++;
          } else if (flag == 2) {
            T[res].x3 = i;
            T[res].y3 = j;
            g[i][j] = 0;
            flag++;
          }
        }
      }
    }
  }
  return 1;
}
int solve1(int x, int y) {
  int num = 0;
  if (g[x][y] == 1) num++;
  if (g[x + 1][y] == 1) num++;
  if (num == 0) return 0;
  if (num == 2) {
    res++;
    T[res].x1 = x, T[res].y1 = y;
    g[x][y] = 0;
    T[res].x2 = x + 1, T[res].y2 = y;
    g[x + 1][y] = 0;
    T[res].x3 = x, T[res].y3 = y - 1;
    g[x][y - 1] = g[x][y - 1] ^ 1;
  } else if (num == 1) {
    res++;
    T[res].x1 = x, T[res].y1 = y - 1;
    g[x][y - 1] = g[x][y - 1] ^ 1;
    T[res].x2 = x + 1, T[res].y2 = y - 1;
    g[x + 1][y - 1] = g[x + 1][y - 1] ^ 1;
    if (g[x][y] == 1) {
      T[res].x3 = x, T[res].y3 = y;
      g[x][y] = 0;
    } else {
      T[res].x3 = x + 1, T[res].y3 = y;
      g[x + 1][y] = 0;
    }
  }
  return 1;
}
int solve2(int x, int y) {
  int num = 0;
  if (g[x][y] == 1) num++;
  if (g[x][y + 1] == 1) num++;
  if (num == 0) return 0;
  if (num == 2) {
    res++;
    T[res].x1 = x, T[res].y1 = y;
    g[x][y] = 0;
    T[res].x2 = x, T[res].y2 = y + 1;
    g[x][y + 1] = 0;
    T[res].x3 = x - 1, T[res].y3 = y;
    g[x - 1][y] = g[x - 1][y] ^ 1;
  } else if (num == 1) {
    res++;
    T[res].x1 = x - 1, T[res].y1 = y;
    g[x - 1][y] = g[x - 1][y] ^ 1;
    T[res].x2 = x - 1, T[res].y2 = y + 1;
    g[x - 1][y + 1] = g[x - 1][y + 1] ^ 1;
    if (g[x][y] == 1) {
      T[res].x3 = x, T[res].y3 = y;
      g[x][y] = 0;
    } else {
      T[res].x3 = x, T[res].y3 = y + 1;
      g[x][y + 1] = 0;
    }
  }
  return 1;
}
int main() {
  int t;
  scanf("%d", &t);
  while (t--) {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) scanf("%1d", &g[i][j]);
    res = 0;
    if (n % 2 == 0 && m % 2 == 0) {
      for (int i = 1; i <= n; i = i + 2)
        for (int j = 1; j <= m; j = j + 2) solve(i, j);
    } else if (n % 2 == 0 && m % 2 == 1) {
      for (int i = 1; i <= n; i = i + 2) solve1(i, m);
      for (int i = 1; i <= n; i = i + 2)
        for (int j = 1; j <= m - 1; j = j + 2) solve(i, j);
    } else if (n % 2 == 1 && m % 2 == 0) {
      for (int i = 1; i <= m; i = i + 2) solve2(n, i);
      for (int i = 1; i <= n - 1; i = i + 2)
        for (int j = 1; j <= m; j = j + 2) solve(i, j);
    } else if (n % 2 == 1 && m % 2 == 1) {
      solve2(n, m - 1);
      for (int i = 1; i <= n - 1; i = i + 2) solve1(i, m);
      for (int i = 1; i <= m - 1; i = i + 2) solve2(n, i);
      for (int i = 1; i <= n - 1; i = i + 2)
        for (int j = 1; j <= m - 1; j = j + 2) solve(i, j);
    }
    printf("%d\n", res);
    for (int i = 1; i <= res; i++)
      printf("%d %d %d %d %d %d\n", T[i].x1, T[i].y1, T[i].x2, T[i].y2, T[i].x3,
             T[i].y3);
  }
  return 0;
}
