#include <bits/stdc++.h>
using namespace std;
void no() { printf("NO\n"); }
void yes() { printf("YES\n"); }
void files() {
  freopen("1.in", "r", stdin);
  freopen("1.out", "w", stdout);
  return;
}
const long long N = 1e5 + 5;
const long long M = 1e9 + 7;
long long binPow(long long base, long long pow, long long m) {
  base %= m;
  long long ans = 1;
  while (pow) {
    if (pow & 1) ans = ans * base % m;
    base = base * base % m;
    pow >>= 1;
  }
  return ans;
}
long long exEuclid(long long a, long long b, long long &x, long long &y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  long long x1, y1;
  long long gcd = exEuclid(b % a, a, x1, y1);
  x = y1 - b / a * x1;
  y = x1;
  return gcd;
}
vector<int> prime;
vector<bool> isPrime;
void sieve(int n) {
  isPrime.resize(n + 1);
  prime.push_back(2);
  for (int i = 3; i <= n; i += 2) {
    if (!isPrime[i]) {
      prime.push_back(i);
      if (1LL * i * i <= 1LL * n) {
        for (int j = i * i; j <= n; j += i) {
          isPrime[j] = true;
        }
      }
    }
  }
  return;
}
int phi(int n) {
  int res = n;
  for (int i = 2; i * i <= n && n > 1; i += (i % 2) + 1) {
    if (n % i == 0) {
      while (n % i == 0) n /= i;
      res -= res / i;
    }
  }
  if (n != 1) res -= res / n;
  return res;
}
long long modInv(long long a, long long m) {
  if (a == 0) return 1;
  long long x, y;
  long long gcd = exEuclid(a, m, x, y);
  if (gcd != 1) return -1;
  return (x % m + m) % m;
}
void sol() {
  int n, m;
  cin >> n >> m;
  string s[n];
  for (int i = 0; i < n; ++i) {
    cin >> s[i];
  }
  vector<pair<int, int>> p;
  for (int i = 0; i + 1 < n; ++i) {
    for (int j = 0; j + 1 < m; ++j) {
      int fre = 0;
      fre += s[i][j] == '1' ? 1 : 0;
      fre += s[i + 1][j] == '1' ? 1 : 0;
      fre += s[i][j + 1] == '1' ? 1 : 0;
      fre += s[i + 1][j + 1] == '1' ? 1 : 0;
      vector<pair<int, int>> keep;
      keep.push_back({i, j});
      keep.push_back({i, j + 1});
      keep.push_back({i + 1, j});
      keep.push_back({i + 1, j + 1});
      if (fre == 0)
        continue;
      else if (fre == 1) {
        int id = 0;
        for (int k = 0; k < 4; ++k) {
          auto it = keep[k];
          if (s[it.first][it.second] == '1') {
            id = k;
            break;
          }
        }
        p.push_back(keep[id]);
        unordered_map<int, bool> vis;
        int cnt = 0;
        for (int k = 0; k < 4 && cnt < 2; ++k) {
          if (k == id) continue;
          p.push_back(keep[k]);
          cnt++;
          vis[k] = true;
        }
        p.push_back(keep[id]);
        int skip = 0;
        for (int k = 0; k < 4; ++k) {
          if (k == id) continue;
          if (vis[k]) {
            skip = k;
            p.push_back(keep[k]);
            break;
          }
        }
        for (int k = 0; k < 4; ++k) {
          if (k == id) continue;
          if (!vis[k]) {
            p.push_back(keep[k]);
            break;
          }
        }
        for (int k = 0; k < 4; ++k) {
          if (k == skip) continue;
          p.push_back(keep[k]);
        }
        for (int k = 0; k < 4; ++k) {
          auto it = keep[k];
          s[it.first][it.second] = '0';
        }
        if (j + 3 < m) ++j;
      } else if (fre == 2) {
        unordered_map<int, bool> vis;
        for (int k = 0; k < 4; ++k) {
          auto it = keep[k];
          if (s[it.first][it.second] == '1') vis[k] = true;
          ;
        }
        for (int k = 0; k < 4; ++k) {
          if (vis[k]) continue;
          p.push_back(keep[k]);
        }
        int skip = 0;
        for (int k = 0; k < 4; ++k) {
          if (vis[k]) {
            p.push_back(keep[k]);
            skip = k;
            break;
          }
        }
        for (int k = 0; k < 4; ++k) {
          if (k == skip) continue;
          p.push_back(keep[k]);
        }
        for (int k = 0; k < 4; ++k) {
          auto it = keep[k];
          s[it.first][it.second] = '0';
        }
        if (j + 3 < m) ++j;
      } else if (fre == 3) {
        for (int k = 0; k < 4; ++k) {
          auto it = keep[k];
          if (s[it.first][it.second] == '1') {
            s[it.first][it.second] = '0';
            p.push_back(it);
          }
        }
        if (j + 3 < m) ++j;
      } else {
        if (j + 2 < m || i + 3 == n) {
          for (int k = 0; k < 3; ++k) {
            p.push_back(keep[k]);
            s[keep[k].first][keep[k].second] = '0';
          }
          continue;
        }
        for (int k = 0; k < 3; ++k) {
          p.push_back(keep[k]);
          auto it = keep[k];
          s[it.first][it.second] = '0';
        }
        int id = 3;
        p.push_back(keep[id]);
        unordered_map<int, bool> vis;
        int cnt = 0;
        for (int k = 0; k < 4 && cnt < 2; ++k) {
          if (k == id) continue;
          p.push_back(keep[k]);
          cnt++;
          vis[k] = true;
        }
        p.push_back(keep[id]);
        int skip = 0;
        for (int k = 0; k < 4; ++k) {
          if (k == id) continue;
          if (vis[k]) {
            skip = k;
            p.push_back(keep[k]);
            break;
          }
        }
        for (int k = 0; k < 4; ++k) {
          if (k == id) continue;
          if (!vis[k]) {
            p.push_back(keep[k]);
            break;
          }
        }
        for (int k = 0; k < 4; ++k) {
          if (k == skip) continue;
          p.push_back(keep[k]);
        }
        for (int k = 0; k < 4; ++k) {
          auto it = keep[k];
          s[it.first][it.second] = '0';
        }
      }
    }
    if (i + 3 < n) ++i;
  }
  cout << (int)p.size() / 3 << "\n";
  for (int i = 0; i + 2 < (int)p.size(); i += 3) {
    cout << p[i].first + 1 << " " << p[i].second + 1 << " "
         << p[i + 1].first + 1 << " " << p[i + 1].second + 1 << " "
         << p[i + 2].first + 1 << " " << p[i + 2].second + 1 << "\n";
  }
}
int main() {
  int tc = 1;
  scanf("%d", &tc);
  while (tc--) {
    sol();
  }
}
