#include <bits/stdc++.h>
using namespace std;
clock_t __stt;
inline void TStart() { __stt = clock(); }
inline void TReport() {
  printf("\nCurrent Case Taken Time : %.3lf sec\n",
         (double)(clock() - __stt) / CLOCKS_PER_SEC);
}
template <typename T>
T MIN(T a, T b) {
  return a < b ? a : b;
}
template <typename T>
T MAX(T a, T b) {
  return a > b ? a : b;
}
template <typename T>
T ABS(T a) {
  return a > 0 ? a : (-a);
}
template <typename T>
void UMIN(T &a, T b) {
  if (b < a) a = b;
}
template <typename T>
void UMAX(T &a, T b) {
  if (b > a) a = b;
}
int n, m, tar;
char s[2005];
vector<pair<int, int> > res;
bitset<2005> occ[2005];
vector<pair<int, pair<int, int> > > eds;
namespace DSU {
int fa[2005];
void init() {
  int i;
  for (i = 0; i < n; ++i) fa[i] = i;
}
int ancestor(int x) {
  if (fa[x] != x) fa[x] = ancestor(fa[x]);
  return fa[x];
}
void unite(int u, int v) {
  u = ancestor(u);
  v = ancestor(v);
  fa[u] = v;
}
};  // namespace DSU
void solve() {
  int i, j, k;
  scanf("%d%d", &n, &m);
  tar = 0;
  for (i = 0; i < n; ++i) occ[i].reset();
  for (i = 0; i < m; ++i) {
    scanf("%s", s);
    for (j = 0; j < n; ++j) {
      if (s[j] == '1') {
        occ[j][i] = 1;
        ++tar;
      }
    }
    --tar;
  }
  eds.clear();
  for (i = 0; i < n; ++i) {
    for (j = i + 1; j < n; ++j) {
      int w = (occ[i] & occ[j]).count();
      eds.push_back(make_pair(w, make_pair(i, j)));
    }
  }
  sort(eds.begin(), eds.end());
  DSU::init();
  res.clear();
  for (i = (int)eds.size() - 1; i >= 0; --i) {
    int u = eds[i].second.first, v = eds[i].second.second, w = eds[i].first;
    if (DSU::ancestor(u) != DSU::ancestor(v)) {
      DSU::unite(u, v);
      res.push_back(make_pair(u, v));
      tar -= w;
    }
  }
  if (tar)
    printf("NO\n");
  else {
    printf("YES\n");
    for (i = 0; i < (int)res.size(); ++i) {
      printf("%d %d\n", res[i].first + 1, res[i].second + 1);
    }
  }
}
int main() {
  int t;
  scanf("%d", &t);
  while (t--) {
    solve();
  }
  return 0;
}
