#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T read() {
  T r = 0, f = 0;
  char c;
  while (!isdigit(c = getchar())) f |= (c == '-');
  while (isdigit(c)) r = (r << 1) + (r << 3) + (c ^ 48), c = getchar();
  return f ? -r : r;
}
inline int getnum() {
  char c;
  while (!isdigit(c = getchar()))
    ;
  return c ^ 48;
}
struct Ed {
  int u, v, w;
  bool operator<(const Ed &e) const { return w > e.w; }
} ed[4004004];
struct E {
  int v, nxt;
  E() {}
  E(int v, int nxt) : v(v), nxt(nxt) {}
} e[2222];
int n, m, se, s_e, head[2222], f[2222];
bitset<2222> s[2222];
inline void a_e(int u, int v) {
  e[++s_e] = E(v, head[u]);
  head[u] = s_e;
}
int find(int x) { return x ^ f[x] ? f[x] = find(f[x]) : x; }
inline void Union(int x, int y) { f[find(x)] = find(y); }
inline void init() {
  for (int i = 1; i <= n; i++) f[i] = i;
}
inline void work() {
  n = read<int>(), m = read<int>();
  se = 0, s_e = 0;
  for (int i = 1; i <= n; i++) head[i] = 0, f[i] = i, s[i].reset();
  for (int i = 1; i <= m; i++)
    for (int j = 1; j <= n; j++) s[j][i] = getnum();
  for (int i = 1; i < n; i++)
    for (int j = i + 1; j <= n; j++) {
      se++;
      ed[se].u = i;
      ed[se].v = j;
      ed[se].w = (s[i] & s[j]).count();
    }
  sort(ed + 1, ed + 1 + se);
  for (int i = 1, j = 1; j < n; i++) {
    int u = ed[i].u, v = ed[i].v;
    int fu = find(u), fv = find(v);
    if (fu == fv) continue;
    f[fu] = fv;
    a_e(u, v);
    j++;
  }
  for (int j = 1; j <= m; j++) {
    init();
    for (int u = 1; u <= n; u++) {
      if (!s[u][j]) continue;
      for (int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].v;
        if (s[v][j]) Union(u, v);
      }
    }
    int tot = 0;
    for (int i = 1; i <= n; i++) tot += s[i][j] * (f[i] == i);
    if (tot > 1) return (void)puts("NO");
  }
  puts("YES");
  for (int u = 1; u <= n; u++)
    for (int i = head[u]; i; i = e[i].nxt) printf("%d %d\n", u, e[i].v);
}
int main() {
  int t = read<int>();
  while (t--) work();
  return 0;
}
