#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=200000+10;
int n,na,nb,m,sz,a[maxn],b[maxn],isa[maxn<<2];char s[maxn];
int last,cnt,id[maxn],lst[maxn<<1],f[maxn<<1][20],ch[maxn<<1][26],fa[maxn<<1],len[maxn<<2];
int in[maxn<<2],head[maxn<<2],to[maxn<<3],nxt[maxn<<3],tot;
vector<int> g[maxn<<2];ll dis[maxn<<2];
inline void insert(int c){
int p=last,q=cnt;last=q;len[q]=len[p]+1;
for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=q;
if(!p) fa[q]=1;
else{
int r=ch[p][c];
if(len[p]+1==len[r]) fa[q]=r;
else{
int s=cnt;len[s]=len[p]+1;
memcpy(ch[s],ch[r],sizeof(ch[r]));
fa[s]=fa[r];fa[r]=fa[q]=s;
for(;p&&ch[p][c]==r;p=fa[p]) ch[p][c]=s;
}
}
}
inline void judge(int b){
int l,r;
scanf("%d%d",&l,&r);
r=r-l+1;l=id[l];
for(int i=19;i>=0;i--)
if(f[l][i]&&len[f[l][i]]>=r) l=f[l][i];
isa[sz]=b;len[sz]=r;g[l].push_back(sz);
}
inline bool cmp(const int &x,const int &y){
return len[x]>len[y]||(len[x]==len[y]&&isa[x]>isa[y]);
}
inline void addedge(int x,int y){
to[tot]=y;
nxt[tot]=head[x];
head[x]=tot;
in[y];
}
inline void solve(){
scanf("%s",s+1);n=strlen(s+1);last=cnt=1;
for(int i=n;i>=1;i--) insert(s[i]-'a'),id[i]=last;
for(int i=1;i<=cnt;i) f[i][0]=fa[i];
for(int j=1;j<=19;j)
for(int i=1;i<=cnt;i) f[i][j]=f[f[i][j-1]][j-1];
scanf("%d",&na);sz=cnt;
for(int i=1;i<=na;i++) judge(1),a[i]=sz;
scanf("%d",&nb);
for(int i=1;i<=nb;i++) judge(0),b[i]=sz;
for(int i=1;i<=cnt;i++) sort(g[i].begin(),g[i].end(),cmp);
for(int i=1;i<=cnt;i++){
int last=i;
for(int j=g[i].size()-1;j>=0;j--){
int now=g[i][j];addedge(last,now);
if(!isa[now]) last=now;
}
lst[i]=last;
}
for(int i=2;i<=cnt;i++) addedge(lst[fa[i]],i);
for(int i=1;i<=sz;i++)
if(!isa[i]) len[i]=0;
scanf("%d",&m);
int x,y,f=0;ll ans=0;
for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),addedge(a[x],b[y]);
queue<int> q;
for(int i=1;i<=sz;i++)
if(!in[i]) q.push(i);
while(!q.empty()){
x=q.front(),q.pop();
ans=max(ans,dis[x]+len[x]);
for(int i=head[x];i;i=nxt[i]){
y=to[i];dis[y]=max(dis[y],dis[x]+len[x]);
if(!--in[y]) q.push(y);
}
}
for(int i=1;i<=sz;i++)
if(in[i]){f=1;break;}
if(f) printf("-1\n");
else printf("%lld\n",ans);
while(!q.empty()) q.pop();
for(int i=1;i<=cnt;i++) fa[i]=0,memset(ch[i],0,sizeof(ch[i]));
for(int i=1;i<=sz;i++) g[i].clear(),isa[i]=len[i]=head[i]=dis[i]=in[i]=0;
last=cnt=sz=tot=0;
}
int main(){
int T;
scanf("%d",&T);
while(T--) solve();
return 0;
}