#include <bits/stdc++.h>
using namespace std;
struct ints {
  int a1, a2, a3, a4, a5, a6;
  ints(int _a1, int _a2, int _a3, int _a4, int _a5, int _a6) {
    a1 = _a1;
    a2 = _a2;
    a3 = _a3;
    a4 = _a4;
    a5 = _a5;
    a6 = _a6;
  }
};
const int maxn = 101;
int T;
int N, M;
string s[maxn];
vector<bool> v[maxn];
vector<ints> sol;
void solve1(int x, int y, vector<pair<int, int> > krivi) {
  int a1 = krivi[0].first;
  int a2 = krivi[0].second;
  v[krivi[0].first][krivi[0].second] = 0;
  if (krivi[0].first == x) {
    v[x + 1][y] = 1;
    v[x + 1][y + 1] = 1;
    ints n(a1, a2, x + 1, y, x + 1, y + 1);
    sol.push_back(n);
  } else {
    v[x][y] = 1;
    v[x][y + 1] = 1;
    ints n(a1, a2, x, y, x, y + 1);
    sol.push_back(n);
  }
  return;
}
void solve2(int x, int y, vector<pair<int, int> > krivi) {
  int a1 = krivi[0].first;
  int a2 = krivi[0].second;
  v[krivi[0].first][krivi[0].second] = 0;
  int a[5];
  int cnt = 0;
  for (int i = x; i < x + 2; i++) {
    for (int j = y; j < y + 2; j++) {
      bool dobar = 1;
      for (int k = 0; k < 2; k++) {
        if (make_pair(i, j) == krivi[k]) dobar = 0;
      }
      if (dobar) {
        v[i][j] = 1;
        a[cnt] = i;
        a[cnt + 1] = j;
        cnt += 2;
      }
    }
  }
  ints n(a1, a2, a[0], a[1], a[2], a[3]);
  sol.push_back(n);
  return;
}
void solve3(int x, int y, vector<pair<int, int> > krivi) {
  int f[6];
  int cnt = 0;
  for (int i = 0; i < 3; i++) {
    int a = krivi[i].first;
    int b = krivi[i].second;
    f[cnt] = a;
    f[cnt + 1] = b;
    v[a][b] = 0;
    cnt += 2;
  }
  ints n(f[0], f[1], f[2], f[3], f[4], f[5]);
  sol.push_back(n);
  return;
}
void solve(int x, int y) {
  vector<pair<int, int> > krivi;
  if (v[x][y] == 1) krivi.push_back(make_pair(x, y));
  if (v[x + 1][y] == 1) krivi.push_back(make_pair(x + 1, y));
  if (v[x + 1][y + 1] == 1) krivi.push_back(make_pair(x + 1, y + 1));
  if (v[x][y + 1] == 1) krivi.push_back(make_pair(x, y + 1));
  if (krivi.size() == 0) return;
  if (krivi.size() == 1) solve1(x, y, krivi);
  if (krivi.size() == 2) solve2(x, y, krivi);
  if (krivi.size() == 3 or krivi.size() == 4) solve3(x, y, krivi);
  solve(x, y);
  return;
}
void shuff(int x, int y, int pozx, int pozy) {
  int a[6];
  int cnt = 0;
  for (int i = x; i < x + 2; i++) {
    for (int j = y; j < y + 2; j++) {
      if (i != x + pozx or j != y + pozy) {
        a[cnt] = i;
        a[cnt + 1] = j;
        cnt += 2;
        v[i][j] = !v[i][j];
      }
    }
  }
  ints n(a[0], a[1], a[2], a[3], a[4], a[5]);
  sol.push_back(n);
  return;
}
void rijesi() {
  for (int i = 0; i < N; i += 2) {
    for (int j = 0; j < M; j += 2) {
      if (i + 1 >= N) {
        if (j + 1 >= M) {
          solve(i - 1, j - 1);
        } else
          solve(i - 1, j);
      } else if (j + 1 >= M) {
        solve(i, j - 1);
      } else
        solve(i, j);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> T;
  while (T--) {
    cin >> N >> M;
    for (int i = 0; i < N; i++) v[i].clear();
    sol.clear();
    for (int i = 0; i < N; i++) {
      cin >> s[i];
      for (int j = 0; j < M; j++) v[i].push_back(s[i][j] - '0');
    }
    for (int i = 0; i < N - 1; i++) {
      for (int j = 0; j < M - 1; j++) {
        if (v[i][j] == 1) {
          ints n(i, j, i + 1, j, i + 1, j + 1);
          sol.push_back(n);
          v[i][j] = 0;
          v[i + 1][j] = !v[i + 1][j];
          v[i + 1][j + 1] = !v[i + 1][j + 1];
        }
      }
    }
    rijesi();
    if (sol.size() > N * M) {
      sol.clear();
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
          v[i][j] = s[i][j] - '0';
        }
      }
      for (int i = N - 1; i > 0; i--) {
        for (int j = 0; j < M - 1; j++) {
          if (v[i][j] == 1) {
            ints n(i, j, i - 1, j, i - 1, j + 1);
            sol.push_back(n);
            v[i][j] = 0;
            v[i - 1][j] = !v[i - 1][j];
            v[i - 1][j + 1] = !v[i - 1][j + 1];
          }
        }
      }
      rijesi();
    }
    if (sol.size() > N * M) {
      sol.clear();
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
          v[i][j] = s[i][j] - '0';
        }
      }
      for (int i = 0; i < N - 1; i++) {
        for (int j = M - 1; j > 0; j--) {
          if (v[i][j] == 1) {
            ints n(i, j, i + 1, j, i + 1, j - 1);
            sol.push_back(n);
            v[i][j] = 0;
            v[i + 1][j] = !v[i + 1][j];
            v[i + 1][j - 1] = !v[i + 1][j - 1];
          }
        }
      }
      rijesi();
    }
    if (sol.size() > N * M) {
      sol.clear();
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
          v[i][j] = s[i][j] - '0';
        }
      }
      for (int i = N - 1; i > 0; i--) {
        for (int j = M - 1; j > 0; j--) {
          if (v[i][j] == 1) {
            ints n(i, j, i - 1, j, i - 1, j - 1);
            sol.push_back(n);
            v[i][j] = 0;
            v[i - 1][j] = !v[i - 1][j];
            v[i - 1][j - 1] = !v[i - 1][j - 1];
          }
        }
      }
      rijesi();
    }
    if (sol.size() > N * M) {
      sol.clear();
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
          v[i][j] = s[i][j] - '0';
        }
      }
      for (int j = 0; j < M - 1; j++) {
        for (int i = 0; i < N - 1; i++) {
          if (v[i][j] == 1) {
            ints n(i, j, i, j + 1, i + 1, j + 1);
            sol.push_back(n);
            v[i][j] = 0;
            v[i][j + 1] = !v[i][j + 1];
            v[i + 1][j + 1] = !v[i + 1][j + 1];
          }
        }
      }
      rijesi();
    }
    if (sol.size() > N * M) {
      sol.clear();
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
          v[i][j] = s[i][j] - '0';
        }
      }
      for (int j = 0; j < M - 1; j++) {
        for (int i = N - 1; i > 0; i--) {
          if (v[i][j] == 1) {
            ints n(i, j, i, j + 1, i - 1, j + 1);
            sol.push_back(n);
            v[i][j] = 0;
            v[i][j + 1] = !v[i][j + 1];
            v[i - 1][j + 1] = !v[i - 1][j + 1];
          }
        }
      }
      rijesi();
    }
    if (sol.size() > N * M) {
      sol.clear();
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
          v[i][j] = s[i][j] - '0';
        }
      }
      for (int j = M - 1; j > 0; j--) {
        for (int i = N - 1; i > 0; i--) {
          if (v[i][j] == 1) {
            ints n(i, j, i, j - 1, i - 1, j - 1);
            sol.push_back(n);
            v[i][j] = 0;
            v[i][j - 1] = !v[i][j - 1];
            v[i - 1][j - 1] = !v[i - 1][j - 1];
          }
        }
      }
      rijesi();
    }
    if (sol.size() > N * M) {
      sol.clear();
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
          v[i][j] = s[i][j] - '0';
        }
      }
      for (int j = M - 1; j > 0; j--) {
        for (int i = 0; i < N - 1; i++) {
          if (v[i][j] == 1) {
            ints n(i, j, i, j - 1, i + 1, j - 1);
            sol.push_back(n);
            v[i][j] = 0;
            v[i][j - 1] = !v[i][j - 1];
            v[i + 1][j - 1] = !v[i + 1][j - 1];
          }
        }
      }
      rijesi();
    }
    if (sol.size() > N * M) {
      while (sol.size() > N * M) {
        srand(time(0));
        sol.clear();
        for (int i = 0; i < N; i++) {
          for (int j = 0; j < M; j++) {
            v[i][j] = s[i][j] - '0';
          }
        }
        int koliko = rand() % 5 + 1;
        for (int i = 0; i < koliko; i++) {
          int r = rand() % (N - 1);
          int st = rand() % (M - 1);
          int pozx = rand() % 2;
          int pozy = rand() % 2;
          shuff(r, st, pozx, pozy);
        }
        rijesi();
      }
    }
    cout << sol.size() << endl;
    for (int i = 0; i < sol.size(); i++) {
      cout << sol[i].a1 + 1 << ' ' << sol[i].a2 + 1 << ' ' << sol[i].a3 + 1
           << ' ' << sol[i].a4 + 1 << ' ' << sol[i].a5 + 1 << ' '
           << sol[i].a6 + 1 << endl;
    }
  }
}
