#include<iostream> #include<vector> #include<stack> #include<cstring> #include<cstdio> using namespace std; const int MAXN = 1001; vector<int> g[MAXN];//adjlist stack<int> S,P; int belong[MAXN],vis[MAXN],indeg[MAXN],sccg[MAXN][MAXN],scccnt,disc[MAXN]; void init() { for(int i=0;i<MAXN;i++)g[i].clear(); memset(belong,-1,sizeof(belong)); memset(vis,0,sizeof(vis)); scccnt = 0; memset(sccg,0,sizeof(sccg)); memset(indeg,0,sizeof(indeg)); while(!S.empty())S.pop(); while(!P.empty())P.pop(); } void dfs_scc(int u,int &time) { disc[u] = time++; S.push(u); P.push(u); vis[u] = 1; for(int i=0;i<g[u].size();i++) { int v = g[u][i]; if(!vis[v]) { dfs_scc(v,time); } else if(belong[v]==-1) { while(disc[P.top()]>disc[v])P.pop(); } } if(P.top()==u) { while(S.top()!=u) { int v = S.top(); belong[v] = scccnt; S.pop(); } S.pop(); belong[u] = scccnt; P.pop(); scccnt++; } } void Gabow(int n) { int time = 0; for(int i=1;i<=n;i++) { if(!vis[i])dfs_scc(i,time); } } void make_sccg(int n) { for(int i=1;i<=n;i++) { for(int j=0;j<g[i].size();j++) { if(belong[i]!=belong[g[i][j]]) { sccg[belong[i]][belong[g[i][j]]]=1; } } } } void cac_indeg() { for(int i=0;i<scccnt;i++) { for(int j=0;j<scccnt;j++) { if(sccg[j][i])indeg[i]++; } } } bool solve(int n) { Gabow(n); make_sccg(n); cac_indeg(); memset(vis,0,sizeof(vis)); for(int i=0;i<scccnt;i++) { int cnt=0,v; for(int j=0;j<scccnt;j++) { if(indeg[j]==0&&!vis[j])v=j,cnt++; } if(cnt!=1)return false; vis[v] = 1; for(int w=0;w<scccnt;w++) { if(sccg[v][w])indeg[w]--; } } return true; } int main() { int t,n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(); for(int i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); g[a].push_back(b); } bool ok = solve(n); if(ok) printf("Yes\n"); else printf("No\n"); } return 0; }