#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
const int maxm=maxn*maxn;
struct DLX
{
const static int maxn=1001,maxm=1001,maxnode=100010;
int n,m,sz,anssz;
int u[maxnode],d[maxnode],l[maxnode],r[maxnode],row[maxnode],col[maxnode];
//row col 记录该节点i坐标
int h[maxn],colcnt[maxm]; //排头及列节点计数
// int ans[maxn];
void init(int _n,int _m) //数据位于1,1...n,m
{
n=_n,m=_m;
for(int i=0;i<=m;i++)//1..m是每一列的辅助结点 0代表(0,0)即head
{
u[i]=d[i]=i;
l[i]=i-1;r[i]=i+1;
col[i]=i;row[i]=0;
colcnt[i]=0;
}
l[0]=m;r[m]=0;
sz=m;anssz=0;
for(int i=1;i<=n;i++)h[i]=-1;
}
void push(int x,int y)
{
colcnt[y]++;
col[++sz]=y;
row[sz]=x;
d[sz]=d[y]; //加入列首元素后面
u[sz]=y;
u[d[y]]=sz;
d[y]=sz;
if(h[x]<0) h[x]=r[sz]=l[sz]=sz; //成为行首元素
else{
int hd=h[x]; //加入行首节点右边
l[sz]=hd;
r[sz]=r[hd];
l[r[hd]]=sz;
r[hd]=sz;
}
}
void delcol_row(int x) //列首节点
{
r[l[x]]=r[x];//left's right=right
l[r[x]]=l[x];//right's left=left
//左右节点跳过列首节点,自己的信息依然保留
for(int i=d[x];i!=x;i=d[i]) //删除该列占据的每一行除该列的元素的上下连接
for(int j=r[i];j!=i;j=r[j])//,节点信息本身依然保留
d[u[j]]=d[j],u[d[j]]=u[j],colcnt[col[j]]--;
}
void rebackcol_row(int x)//恢复del操作
{
for(int i=u[x];i!=x;i=u[i]) //注意逆操作的顺序
for(int j=l[i];j!=i;j=l[j])
colcnt[col[ d[u[j]] = u[d[j]] = j]]++;
r[l[x]]=l[r[x]]=x;
}
void outall()
{
for(int i=0;i<=sz;i++)
out(i);
}
bool dance(int dep)
{
if(r[0]==0) {
anssz=dep;
return true;
}
int cur=r[0];
for(int i=r[0];i!=0;i=r[i])if(colcnt[i]<colcnt[cur])cur=i;
delcol_row(cur);
for(int i=d[cur];i!=cur;i=d[i])
{
// ans[dep]=row[i];
for(int j=r[i];j!=i;j=r[j]) delcol_row(col[j]);
if(dance(dep+1)) return true;
for(int j=l[i];j!=i;j=l[j]) rebackcol_row(col[j]); //注意逆操作的顺序
}
rebackcol_row(cur);
return false;
}
};
DLX dlx;
int main()
{
#ifdef shuaishuai
freopen("in.txt","r",stdin);
#endif // shuaishuai
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
dlx.init(n,m);
for(int i=1,x;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&x);
if(x)dlx.push(i,j);
}
puts(dlx.dance(0)? "Yes":"No");
}
return 0;
}