#include <bits/stdc++.h>
using namespace std;
long long a[100000],b[100000],health[100000],recover[100000],drop[100000],swd[100000];
multiset<long long> sword;
multiset<long long>::iterator it;
struct exg{
long long gcd;
long long x;
long long y;
};
long long fastread(){
char ch=getchar();
long long x=0;
while(ch<'0'||ch>'9')
{
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
exg exgcd(long long aa,long long bb){
exg e;
if(bb==0)
{
e.x=1;
e.y=0;
e.gcd=aa;
return e;
}
e=exgcd(bb,aa%bb);
long long mem=e.y;
e.y=e.x-aa/bb*e.y;
e.x=mem;
return e;
}
long long timmod(long long aa,long long bb,long long mod){
long long ans=0,math=aa,flag=1;
if(bb<0)
{
bb=-bb;
flag=-1;
}
while(bb>0)
{
if(bb&1)
{
ans+=math;
ans%=mod;
}
math=math+math;
math%=mod;
bb>>=1;
}
return ans*flag;
}
long long excrt(int n){
int i;
long long k,lcm;
exg e;
for(i=1;i<n;i++)
{
e=exgcd(a[i-1],a[i]);
if((b[i]-b[i-1])%e.gcd!=0)return -1;
lcm=a[i-1]/e.gcd*a[i];
k=timmod(e.x,(b[i]-b[i-1])/e.gcd,lcm);
b[i]=(timmod(k,a[i-1],lcm)+b[i-1])%lcm;
if(b[i]<0)b[i]+=lcm;
a[i]=lcm;
}
return b[n-1];
}
int main(int argc, char** argv) {
int t,n,m,i,flag;
long long maxi,tmp,x;
exg e;
for(t=fastread();t>0;t--)
{
maxi=0;
n=fastread();
m=fastread();
for(i=0;i<n;i++)health[i]=fastread();
for(i=0;i<n;i++)recover[i]=fastread();
for(i=0;i<n;i++)drop[i]=fastread();
for(i=0;i<m;i++)
{
tmp=fastread();
sword.insert(tmp);
}
for(i=0;i<n;i++)
{
it=upper_bound(sword.begin(),sword.end(),health[i]);
if(it!=sword.begin())it--;
swd[i]=(*it);
sword.erase(it);
sword.insert(drop[i]);
}
for(i=0;i<n;i++)
{
if(maxi<(health[i]+swd[i]-1)/swd[i])maxi=(health[i]+swd[i]-1)/swd[i];
health[i]%=recover[i];
}
flag=0;
for(i=0;i<n;i++)
{
e=exgcd(swd[i],recover[i]);
if(health[i]%e.gcd!=0)
{
flag=1;
break;
}
swd[i]/=e.gcd;
recover[i]/=e.gcd;
health[i]/=e.gcd;
b[i]=timmod(e.x,health[i],recover[i]);
if(b[i]<0)b[i]+=recover[i];
a[i]=recover[i];
}
if(flag==1)
{
cout<<"-1\n";
continue;
}
x=excrt(n);
if(x==-1)
{
cout<<"-1\n";
continue;
}
if(x<maxi)x+=((maxi-x+a[n-1]-1)/a[n-1])*a[n-1];
cout<<x<<'\n';
sword.clear();
}
return 0;
}