#include<iostream> #include<cstdio> #include<vector> #include<map> #include<queue> #include<cstring> using namespace std; #define MP make_pair #define PB push_back const int N=10005; vector<int> mp[N],rv[N]; map< pair<int,int>,int > vis; int f[N],p2i[N][N]; int dp[N*N][2]; int n,m; struct Dt{ int v,turn; Dt(){} Dt(int _v,int _turn){ v=_v; turn=_turn; } }; queue<Dt> que; void init(){ int id=0; for(int i=1;i<=n;++i) for(int j=i;j<=n;++j) p2i[j][i]=p2i[i][j]=id++; for(int i=0;i<id;++i){ mp[i].clear(); rv[i].clear(); } vis.clear(); for(int i=0;i<id;++i){ dp[i][0]=dp[i][1]=0; } } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); init(); for(int i=0;i<m;++i){ for(int j=1;j<=n;++j) scanf("%d",&f[j]); for(int j=1;j<=n;++j) for(int k=j+1;k<=n;++k){ int fr=p2i[j][k]; int to=p2i[f[j]][f[k]]; if(vis[MP(fr,to)]==0){ mp[fr].PB(to); rv[to].PB(fr); vis[MP(fr,to)]=1; } } } for(int i=1;i<=n;++i){ que.push(Dt(p2i[i][i],0)); que.push(Dt(p2i[i][i],1)); dp[p2i[i][i]][0]=dp[p2i[i][i]][1]=1; } while(!que.empty()){ Dt now=que.front(); que.pop(); if(now.turn==0){ int to=now.v; for(int i=0;i<rv[to].size();++i){ int fr=rv[to][i]; if(dp[fr][1]==0){ int st=1; for(int i=0;i<mp[fr].size();++i) st&=dp[mp[fr][i]][0]; dp[fr][1]=st; if(dp[fr][1]) que.push(Dt(fr,1)); } } } else{ int to=now.v; for(int i=0;i<rv[to].size();++i){ int fr=rv[to][i]; if(dp[fr][0]==0){ dp[fr][0]=1; que.push(Dt(fr,0)); } } } } int ans=1; for(int i=1;i<=n;++i){ for(int j=i;j<=n;++j){ ans&=dp[p2i[i][j]][0]; } } if(ans) puts("YES"); else puts("NO"); } return 0; }