```cpp
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 100005
#define int long long
using namespace std;
int n,m,a[N],p[N],k[N],b[N];
multiset<int>s;
typedef multiset<int>::iterator it;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
int lcm(int x,int y){return x/gcd(x,y)*y;}
void exgcd(int A,int B,int &x,int &y){
if(!B){x=1;y=0;return;}
int xx,yy;
exgcd(B,A%B,xx,yy);
x=yy;y=xx-(A/B)*yy;
}
int mul(int x,int y,int p){
int now=0;
for(;y;y>>=1,x=(x<<1)%p)if(y&1)now=(now+x)%p;
return now;
}
void solve(){
scanf("%lld%lld",&n,&m);
rep(i,1,n)scanf("%lld",&a[i]);
rep(i,1,n)scanf("%lld",&p[i]);
rep(i,1,n)scanf("%lld",&k[i]);
s.clear();
rep(i,1,m){
int x;scanf("%lld",&x);
s.insert(x);
}
rep(i,1,n){
it now=s.upper_bound(a[i]);
if(now!=s.begin())now--;
b[i]=*now;
s.erase(now);s.insert(k[i]);
}
int lm=1,xx=0;
rep(i,1,n){
int g=gcd(b[i]*lm,p[i]);
int c=a[i]-b[i]*xx;
if(abs(c)%g!=0){puts("-1");return;}
int x,y;
exgcd(b[i]*lm,p[i],x,y);
c/=g;x*=c;y*=c;
x=(x%p[i]+p[i])%p[i];
g=lcm(p[i],lm);
xx=(xx+mul(lm,x,g))%g;lm=g;
}
//cout<<xx<<" "<<lm<<endl;
rep(i,1,n){
int mn=(a[i]-1)/b[i]+1;
if(mn>xx){
int dta=mn-xx;
xx+=((dta-1)/lm+1)*lm;
}
}
printf("%lld\n",xx);
}
signed main(){
//freopen("dragon5.in","r",stdin);
//freopen("dragon.out","w",stdout);
int T;scanf("%lld",&T);
while(T--)solve();
return 0;
}
```
by 7KByte @ 2020-08-31 16:42:47