#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxx=99999999;
int t,n,m,l,k;
struct A
{
int s,e,v;
} f[5205];
int dis[505];
bool bellman_ford()
{
bool flag;
int i=0;
for(i=1;i<=n;i++){ dis[i] = maxx; }//因为只是判断是否有负环,所以dis[i]数组赋不赋值也都无所谓了,但是要是求最短路径的话就必须赋值
dis[1]=0;
// for(i=0;i<10;i++)
// printf("%d ",dis[i]);
for(i=1; i<=n; i++)
{
flag=false;
for(int j=0; j<k; j++)
{
if(dis[f[j].e]>dis[f[j].s]+f[j].v)
{
dis[f[j].e]=dis[f[j].s]+f[j].v;
flag=true;
}
}
//每条边进行|V|-1次松弛后,检查是否存在负环并返回相应的布尔值,
//因为进行|V|-1次松弛后若没有负环则v.d的值确定不变,
//若有负环则会继续进行松弛操作,因为一个数+负数是一定比它本身要小的。
//总之就是:有负环松弛操作就会继续,没负环松弛操作就会停止
if(!flag)
break;//也可以直接就返回false,因为flag为false就说明不在松弛了,
//也就是说不存在负环,但是后面还是得在判断一次,因为有可能刚好最后一次可以松弛
//从而使得flag为true.
}
if(i==n+1)//判断松弛操作是否还在继续,还在继续就存在负环咯
return true;
else
return false;
}
int main()
{
int a,b,c;
scanf("%d",&t);
while(t--)
{
k=0;
scanf("%d %d %d",&n,&m,&l);
for(int i=0; i<m; i++)
{
scanf("%d %d %d",&a,&b,&c);
f[k].s=a;
f[k].e=b;
f[k++].v=c;
f[k].s=b;
f[k].e=a;
f[k++].v=c;
}
for(int i=0; i<l; i++)
{
scanf("%d %d %d",&a,&b,&c);
f[k].s=a;
f[k].e=b;
f[k++].v=-c;
}
//printf("%d\n",k);
if(bellman_ford())//bug你藏得好深,找啊找,找的我想哭,把函数bellman_ford()写成了bellman_ford,我也是醉了,想死的心都有了,你为何如此待我,我容易吗我。aaaaaaaaaaaaaaaaaaa.............
printf("YES\n");
else
printf("NO\n");
}
return 0;
}