import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Comparator;
class ASHIGIFT {
static long dispop[][],X;
// TODO Auto-generated method stub
int t=r.nextInt();
StringBuilder sb=new StringBuilder();
while(t-->0){
X=r.nextInt();
int B=r.nextInt();
dispop=new long[B+10000][3];
int i=0;
long limit=0;
for(;i<B;i++){
dispop[i][0]=r.nextLong();
dispop[i][1]=r.nextLong();
limit+=dispop[i][1];
dispop[i][2]=-1;
}
int C=r.nextInt();
for(int j=0;j<C;j++,i++){
dispop[i][0]=r.nextLong();
dispop[i][2]=r.nextLong();
dispop[i][1]=r.nextLong();
}
if(C==0){sb.append((limit+1)+"\n");continue;}
Arrays.
sort(dispop,
0, B
+C,
new Comparator
<long []>() {
@Override
public int compare(long[] o1, long[] o2) {
// TODO Auto-generated method stub
if(o1
[0]==o2
[0])return Integer.
valueOf((int) (o2
[2]-o1
[2])); return Integer.
valueOf((int) (o1
[0]-o2
[0])); }
});
/*for( i=0;i<B+C;i++){
System.out.println(dispop[i][0]+" "+dispop[i][1]+" "+dispop[i][2]+"\n");
}
*/
long ans=binarySearch(limit+1);
sb.append(ans+"\n");
}
pr.write(sb.toString());
pr.flush();
pr.close();}
private static long binarySearch(long X){
long low=1,high=X,mid=(low+((high-low)>>1));
while(low<high){
mid=(low+((high-low)>>1));
//System.out.println(mid);
if(findmin(mid,X-1)){
high=mid;
//System.out.println("True\n");
}
else {
low=mid+1;
//System.out.println("False\n");
}
}
mid=(low+((high-low)>>1));
return mid;
}
private static boolean findmin(long p,long m){
for(int i=0;i<dispop.length;i++){
if(dispop[i][0]==dispop[i][1] && dispop[i][1]==dispop[i][2] && dispop[i][2]==0)break;
if(p>=dispop[i][2] && dispop[i][2]!=-1){
p+=dispop[i][1];
}
else if(dispop[i][2]==-1){
p-=dispop[i][1];
m-=dispop[i][1];
if(p<=0)return false;
}
else if(m>=p)return false;
// System.out.println(p+" "+m);
}
return true;
}
final private int BUFFER_SIZE = 1 << 16;
private byte[] buffer;
private int bufferPointer, bytesRead;
buffer = new byte[BUFFER_SIZE];
bufferPointer = bytesRead = 0;
}
buffer = new byte[BUFFER_SIZE];
bufferPointer = bytesRead = 0;
}
byte[] buf = new byte[64];
int cnt = 0, c;
while ((c = read()) != -1) {
if (c == '\n')
break;
buf[cnt++] = (byte) c;
}
return new String(buf,
0, cnt
); }
int ret = 0;
byte c = read();
while (c <= ' ')
c = read();
boolean neg = (c == '-');
if (neg)
c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (neg)
return -ret;
return ret;
}
long ret = 0;
byte c = read();
while (c <= ' ')
c = read();
boolean neg = (c == '-');
if (neg)
c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (neg)
return -ret;
return ret;
}
double ret = 0, div = 1;
byte c = read();
while (c <= ' ')
c = read();
boolean neg = (c == '-');
if (neg)
c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (c == '.')
while ((c = read()) >= '0' && c <= '9')
ret += (c - '0') / (div *= 10);
if (neg)
return -ret;
return ret;
}
bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
if (bytesRead == -1)
buffer[0] = -1;
}
if (bufferPointer == bytesRead)
fillBuffer();
return buffer[bufferPointer++];
}
if (din == null)
return;
din.close();
}
}
}
/*
1
10
6 1 3 2 4 3 1 5 3 6 3 8 7
3 1 2 3 4 5 6 7 8 9
*/
/*
1
10
4
1 2 3 2 5 2 7 2
3
2 1 1
4 1 1
6 1 1
*/