#include <iostream>
#include <map>
#include <string>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1005;
const int MAXE = 1000005;
const __int64 inf = 1000000000000ll;
typedef struct _uq
{
int p;
}UQ;
UQ uqSet[MAXN];
typedef struct _node
{
int u, v, w;
int next;
}N;
N edge[2 * MAXE];
int head[MAXN], cntEdge;
void init()
{
cntEdge = 0;
for(int i = 0; i < MAXN; i++)
{
head[i] = -1;
uqSet[i].p = i;
}
}
void addEdge(int u, int v, int w)
{
edge[cntEdge].u = u;
edge[cntEdge].v = v;
edge[cntEdge].w = w;
edge[cntEdge].next = head[u];
head[u] = cntEdge++;
}
__int64 Bellman_ford(int s, int n)
{
__int64 dis[MAXN];
for(int i = 0; i <= n; i++)
dis[i] = inf;
dis[s] = 0;
for(int i = 0; i < n-1; i++)
{
bool flag = false;
for(int j = 0; j < cntEdge; j++)
{
int u = edge[j].u;
int v = edge[j].v;
__int64 w = edge[j].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
flag = true;
}
}
if(!flag)
break;
}
/*cout << "-----------------" << endl;
for(int i = 0; i <= n; i++)
cout << dis[i] << " ";
cout << "-----------------" << endl;*/
for(int f = 0; f < cntEdge; f++)
{
int u = edge[f].u, v = edge[f].v;
__int64 w = edge[f].w;
if(dis[v] > dis[u] + w)
return -1;
}
return dis[n];
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int n, cas;
scanf("%d", &cas);
while(cas--)
{
init();
int x, y, u, v, w;
scanf("%d %d %d", &n, &x, &y);
for(int i = 0; i < x; i++)
{
scanf("%d %d %d", &u, &v, &w);
addEdge(u, v, w);
}
for(int i = 0; i < y; i++)
{
scanf("%d %d %d", &u, &v, &w);
addEdge(v, u, -w);
}
for(int i = 1; i <= n; i++)
{
addEdge(i, i - 1, 0);
}
__int64 sol = Bellman_ford(1, n);
if(sol == -1)
printf("-1\n");
else if(sol == inf)
printf("-2\n");
else
printf("%I64d\n", sol);
}
return 0;
}