#include <iostream>
#include <string>
using namespace std;
class Graph
{
private:
int vexnum;
int arcnum;
bool *visit;
double **array;
string *vex;
int *road;
int num;
void DFS(int v)
{
}
int Index(string s)
{
for (int i = 0; i < vexnum; i++)
{
if (vex[i] == s)
{
return i;
}
}
return -1;
}
public:
Graph()
{
cin >> vexnum >> arcnum;
vex = new string[vexnum];
visit = new bool[vexnum];
road = new int[vexnum];
array = new double *[vexnum];
for (int i = 0; i < vexnum; i++)
{
cin >> vex[i];
array[i] = new double[vexnum];
visit[i] = 0;
road[i] = 0;
for (int j = 0; j < vexnum; j++)
{
array[i][j] = 0;
}
}
for (int i = 0; i < arcnum; i++)
{
string str1, str2;
double weight;
cin >> str1 >> weight >> str2;
int pos1 = Index(str1), pos2 = Index(str2);
array[pos1][pos2] = weight;
}
}
~Graph()
{
delete[] vex;
delete[] road;
delete[] visit;
for (int i = 0; i < vexnum; i++)
{
delete array[i];
}
delete array;
}
void DFS(int v)
{
visit[v] = true;
road[num++] = v;
for (int i = 0; i < vexnum; i++)
{
if (visit[i] == 0 && array[v][i] != 0)
{
DFS(i);
}
}
}
void DFS_Traverse()
{
for (int i = 0; i < vexnum; i++)
{
num = 0;
DFS(i);
for (int k = 0; k < num; k++)
{
if (array[road[k]][i] != 0)
{
double result = 1;
for (int j = 0; j < k; j++)
{
result *= array[road[j]][road[j + 1]];
}
result *= array[road[k]][road[0]];
if(result>1)
{
cout<<"YES"<<endl;
}
}
}
}
for(int i=0;i<vexnum;i++)
{
visit[i]=0;
road[i]=0;
}
cout<<"NO"<<endl;
}
};
int main()
{
int t;
cin>>t;
while(t--)
{
Graph G;
G.DFS_Traverse();
}
return 0;
}