#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
class Graph
{
private :
bool flag;
bool oddCycle;
stack<int> stk;
int v, e, head, before, ccnt; //cycle을 이루고 있는 정점의 개수
vector<vector<int> > adj;
vector<bool> visited;
public:
Graph(int _v, int _e)
: v(_v), e(_e), flag(true), oddCycle(false), before(-1)
{
adj.resize(0);
visited.resize(0);
}
void SortList()
{
for(int i=1; i<=v; i++)
sort(adj[i].begin(), adj[i].end());
}
void Init(int _v, int _e)
{
v=_v; e=_e;
head = 0; ccnt=0;
adj.resize(v+1);
visited.resize(v+1, false);
}
void AddEdge(int u, int v)
{
adj[u].push_back(v);
adj[v].push_back(u);
}
void FindCycle(stack<int> stk)
{
int head = stk.top();
bool flag;
ccnt=0;
stk.pop();
while(!stk.empty())
{
ccnt++;
if(stk.top()==head)
{
flag = true;
break;
}
stk.pop();
}
if(!flag) ccnt=0;
}
void DFS(int curr, int before)
{
if(visited[curr]) return;
visited[curr]=true;
stk.push(curr);
for(int i=0; i<adj[curr].size(); i++)
{
int next = adj[curr][i];
if(next == before) continue;
if(visited[next])
{
head = next;
stk.push(next);
FindCycle(stk);
stk.pop();
if(ccnt%2==1)
oddCycle=true;
}
DFS(next, curr);
}
stk.pop();
return;
}
void ResetStk()
{
while(!stk.empty())
stk.pop();
}
bool IsOddCycleExist()
{
return oddCycle;
}
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
int k, v, e;
cin>>k;
while(k--)
{
Graph g(0, 0);
bool ansFlag=false;
cin>>v>>e;
g.Init(v, e);
for(int i=0; i<e; i++)
{
int a, b;
cin>>a>>b;
g.AddEdge(a, b);
}
g.SortList();
for(int i=1; i<=v; i++)
{
g.DFS(i, -1);
g.ResetStk();
if(g.IsOddCycleExist())
{
ansFlag=true;
break;
}
}
if(ansFlag)
cout<<"NO\n";
else
cout<<"YES\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxhbGdvcml0aG0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBHcmFwaAp7CnByaXZhdGUgOiAKCWJvb2wgZmxhZzsKCWJvb2wgb2RkQ3ljbGU7CglzdGFjazxpbnQ+IHN0azsKCWludCB2LCBlLCBoZWFkLCBiZWZvcmUsIGNjbnQ7IC8vY3ljbGXsnYQg7J2066Oo6rOgIOyeiOuKlCDsoJXsoJDsnZgg6rCc7IiYIAoJdmVjdG9yPHZlY3RvcjxpbnQ+ID4gYWRqOwoJdmVjdG9yPGJvb2w+IHZpc2l0ZWQ7CgkKcHVibGljOgoJR3JhcGgoaW50IF92LCBpbnQgX2UpIAoJCTogdihfdiksIGUoX2UpLCBmbGFnKHRydWUpLCBvZGRDeWNsZShmYWxzZSksIGJlZm9yZSgtMSkKCXsKCQlhZGoucmVzaXplKDApOwoJCXZpc2l0ZWQucmVzaXplKDApOwoJfQoKCXZvaWQgU29ydExpc3QoKQoJewoJCWZvcihpbnQgaT0xOyBpPD12OyBpKyspCgkJCXNvcnQoYWRqW2ldLmJlZ2luKCksIGFkaltpXS5lbmQoKSk7Cgl9CgkKCXZvaWQgSW5pdChpbnQgX3YsIGludCBfZSkKCXsKCQl2PV92OyBlPV9lOwoJCWhlYWQgPSAwOyBjY250PTA7CgkJYWRqLnJlc2l6ZSh2KzEpOwoJCXZpc2l0ZWQucmVzaXplKHYrMSwgZmFsc2UpOwoJfQoJCgl2b2lkIEFkZEVkZ2UoaW50IHUsIGludCB2KQoJewoJCWFkalt1XS5wdXNoX2JhY2sodik7CgkJYWRqW3ZdLnB1c2hfYmFjayh1KTsKCX0KCQoJdm9pZCBGaW5kQ3ljbGUoc3RhY2s8aW50PiBzdGspCgl7CgkJaW50IGhlYWQgPSBzdGsudG9wKCk7CgkJYm9vbCBmbGFnOwoJCWNjbnQ9MDsKCQkKCQlzdGsucG9wKCk7CgkJCgkJd2hpbGUoIXN0ay5lbXB0eSgpKQoJCXsJCQkKCQkJY2NudCsrOwoJCQkKCQkJaWYoc3RrLnRvcCgpPT1oZWFkKQoJCQl7CgkJCQlmbGFnID0gdHJ1ZTsKCQkJCWJyZWFrOwoJCQl9CgkJCXN0ay5wb3AoKTsKCQl9CgkJCgkJaWYoIWZsYWcpIGNjbnQ9MDsKCX0KCQoJdm9pZCBERlMoaW50IGN1cnIsIGludCBiZWZvcmUpCgl7CgkJaWYodmlzaXRlZFtjdXJyXSkgcmV0dXJuOwoJCQoJCXZpc2l0ZWRbY3Vycl09dHJ1ZTsKCQlzdGsucHVzaChjdXJyKTsKCQkKCQlmb3IoaW50IGk9MDsgaTxhZGpbY3Vycl0uc2l6ZSgpOyBpKyspCgkJewoJCQlpbnQgbmV4dCA9IGFkaltjdXJyXVtpXTsKCQkJCgkJCWlmKG5leHQgPT0gYmVmb3JlKSBjb250aW51ZTsKCQkJCgkJCWlmKHZpc2l0ZWRbbmV4dF0pCgkJCXsKCQkJCWhlYWQgPSBuZXh0OwoJCQkJc3RrLnB1c2gobmV4dCk7CgkJCQlGaW5kQ3ljbGUoc3RrKTsKCQkJCXN0ay5wb3AoKTsKCQkJCQoJCQkJaWYoY2NudCUyPT0xKQoJCQkJCW9kZEN5Y2xlPXRydWU7CgkJCX0KCQkJCgkJCURGUyhuZXh0LCBjdXJyKTsKCQl9CgoJCXN0ay5wb3AoKTsKCQlyZXR1cm47Cgl9CgkKCXZvaWQgUmVzZXRTdGsoKQoJewoJCXdoaWxlKCFzdGsuZW1wdHkoKSkKCQkJc3RrLnBvcCgpOwoJfQkKCQoJYm9vbCBJc09kZEN5Y2xlRXhpc3QoKQoJewoJCXJldHVybiBvZGRDeWNsZTsKCX0KfTsKCmludCBtYWluKCkKewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJY2luLnRpZShOVUxMKTsKCWludCBrLCB2LCBlOwoJCgljaW4+Pms7CgkKCXdoaWxlKGstLSkKCXsKCQlHcmFwaCBnKDAsIDApOwkKCQlib29sIGFuc0ZsYWc9ZmFsc2U7CgkJCgkJY2luPj52Pj5lOwoJCQoJCWcuSW5pdCh2LCBlKTsKCQkKCQlmb3IoaW50IGk9MDsgaTxlOyBpKyspCgkJewoJCQlpbnQgYSwgYjsKCQkJY2luPj5hPj5iOwoJCQlnLkFkZEVkZ2UoYSwgYik7CgkJfQoJCQoJCWcuU29ydExpc3QoKTsKCQkKCQlmb3IoaW50IGk9MTsgaTw9djsgaSsrKQoJCXsKCQkJZy5ERlMoaSwgLTEpOwoJCQkKCQkJZy5SZXNldFN0aygpOwoJCQkKCQkJaWYoZy5Jc09kZEN5Y2xlRXhpc3QoKSkJCgkJCXsKCQkJCWFuc0ZsYWc9dHJ1ZTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmKGFuc0ZsYWcpCgkJCWNvdXQ8PCJOT1xuIjsKCQllbHNlCgkJCWNvdXQ8PCJZRVNcbiI7CgkJCgl9CgkJCglyZXR1cm4gMDsKfQ==