#include<bits/stdc++.h>
using namespace std;
vector< vector< int > > edges(1000005);
bool visited[1000005];
int component[1000005];
void dfs(int node, int num_component){
visited[node] = true;
component[node] = num_component;
for(int i = 0 ; i < (int)edges[node].size(); i++){
int curr = edges[node][i];
if(!visited[curr]){
dfs(curr, num_component);
}
}
return;
}
int main(){
int t;
cin >> t;
while(t--){
int n, k;
cin >> n >>k;
for(int i = 0; i <= n; i++){
edges[i].clear();
visited[i] = false;
}
vector<pair<int, int>> check;
for(int i = 0; i < k; i++){
int x, y;
char ch1, ch2;
cin >> x >> ch1;
if(ch1 == '!'){
cin >> ch2 >> y;
check.push_back(make_pair(x, y));
}
else{
cin >> y;
edges[x].push_back(y);
edges[y].push_back(x);
}
}
int num_component = 1;
for(int i=1; i <=n ; i++){
if(!visited[i]){
dfs(i, num_component);
num_component++;
}
}
bool flag = true;
for(int i = 0; i < (int)check.size(); i++){
int src = check[i].first;
int target = check[i].second;
if(component[src] == component[target]){
flag = false;
break;
}
}
if(flag){
cout<<"YES\n";
}
else{
cout<<"NO\n";
}
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdmVjdG9yPCB2ZWN0b3I8IGludCA+ID4gZWRnZXMoMTAwMDAwNSk7CmJvb2wgdmlzaXRlZFsxMDAwMDA1XTsKaW50IGNvbXBvbmVudFsxMDAwMDA1XTsKdm9pZCBkZnMoaW50IG5vZGUsIGludCBudW1fY29tcG9uZW50KXsKICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlOwogICAgY29tcG9uZW50W25vZGVdID0gbnVtX2NvbXBvbmVudDsKICAgIGZvcihpbnQgaSA9IDAgOyBpIDwgKGludCllZGdlc1tub2RlXS5zaXplKCk7IGkrKyl7CiAgICAgICAgaW50IGN1cnIgPSBlZGdlc1tub2RlXVtpXTsKICAgICAgICBpZighdmlzaXRlZFtjdXJyXSl7CiAgICAgICAgICAgIGRmcyhjdXJyLCBudW1fY29tcG9uZW50KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KaW50IG1haW4oKXsKICAgIGludCB0OwogICAgY2luID4+IHQ7CiAgICB3aGlsZSh0LS0pewogICAgICAgIGludCBuLCBrOwogICAgICAgIGNpbiA+PiBuID4+azsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDw9IG47IGkrKyl7CiAgICAgICAgICAgIGVkZ2VzW2ldLmNsZWFyKCk7CiAgICAgICAgICAgIHZpc2l0ZWRbaV0gPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiBjaGVjazsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgazsgaSsrKXsKICAgICAgICAgICAgaW50IHgsIHk7CiAgICAgICAgICAgIGNoYXIgY2gxLCBjaDI7CiAgICAgICAgICAgIGNpbiA+PiB4ID4+IGNoMTsKICAgICAgICAgICAgaWYoY2gxID09ICchJyl7CiAgICAgICAgICAgICAgICBjaW4gPj4gY2gyID4+IHk7CiAgICAgICAgICAgICAgICBjaGVjay5wdXNoX2JhY2sobWFrZV9wYWlyKHgsIHkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgY2luID4+IHk7CiAgICAgICAgICAgICAgICBlZGdlc1t4XS5wdXNoX2JhY2soeSk7CiAgICAgICAgICAgICAgICBlZGdlc1t5XS5wdXNoX2JhY2soeCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW50IG51bV9jb21wb25lbnQgPSAxOwogICAgICAgIGZvcihpbnQgaT0xOyBpIDw9biA7IGkrKyl7CiAgICAgICAgICAgIGlmKCF2aXNpdGVkW2ldKXsKICAgICAgICAgICAgICAgIGRmcyhpLCBudW1fY29tcG9uZW50KTsKICAgICAgICAgICAgICAgIG51bV9jb21wb25lbnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBib29sIGZsYWcgPSB0cnVlOwogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAoaW50KWNoZWNrLnNpemUoKTsgaSsrKXsKICAgICAgICAgICAgaW50IHNyYyA9IGNoZWNrW2ldLmZpcnN0OwogICAgICAgICAgICBpbnQgdGFyZ2V0ID0gY2hlY2tbaV0uc2Vjb25kOwogICAgICAgICAgICBpZihjb21wb25lbnRbc3JjXSA9PSBjb21wb25lbnRbdGFyZ2V0XSl7CiAgICAgICAgICAgICAgICBmbGFnID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihmbGFnKXsKICAgICAgICAgICAgY291dDw8IllFU1xuIjsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgY291dDw8Ik5PXG4iOwogICAgICAgIH0KICAgIH0KfQ==