#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace acac
{
char S[400010],T[400010];
int SA[400010],rk[400010],He[400010],tmp[400010],C[400010],st[400010][30];
int n,na,nb,nm;;
bool cmp(int a,int b)
{
return S[a]<S[b];
}
void build(int n)
{
for(int i=1;i<=n;i++)
{
SA[i]=i;
}
sort(SA+1,SA+1+n,cmp);
for(int i=n;i;i--)
{
if(i<n&&S[SA[i]]==S[SA[i+1]])rk[SA[i]]=rk[SA[i+1]];
else rk[SA[i]]=i;
}
for(int d=2;;d<<=1)
{
int w=0;
for(int i=1;i<=d/2;i++)
{
tmp[++w]=n-i+1;
}
for(int i=1;i<=n;i++)
{
if(SA[i]>d/2)tmp[++w]=SA[i]-d/2;
}
for(int i=0;i<=n+1;i++)
{
C[i]=i+1;
}
for(int i=n;i;i--)
{
SA[--C[rk[tmp[i]]]]=tmp[i];
}
int tf=1;
for(int i=n;i;i--)
{
if(i!=n&&rk[SA[i]]==rk[SA[i+1]]&&(SA[i]+d/2<=n?rk[SA[i]+d/2]:-1)==(SA[i+1]+d/2<=n?rk[SA[i+1]+d/2]:-1))
{
tmp[SA[i]]=tmp[SA[i+1]];
tf=0;
}
else tmp[SA[i]]=i;
}
for(int i=1;i<=n;i++)
{
rk[i]=tmp[i];
}
if(tf)break;
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(ans)ans--;
if(rk[i]>1)
{
while(SA[rk[i]-1]+ans<=n&&i+ans<=n&&S[SA[rk[i]-1]+ans]==S[i+ans])
{
ans++;
}
}
He[rk[i]]=ans;
}
for(int i=1;i<=n;i++)
{
st[i][0]=He[i];
// cout<<rk[i]<<'\n';
}
for(int j=1;j<=20;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
}
struct edge
{
int to,ne;
}e[7000010];
int H[7000010],ds[7000010],D[7000010];
long long dp[7000010],val[7000010];
int cnt;
int tot;
void add(int a,int b)
{
// cout<<a<<' '<<b<<endl;
e[++cnt].to=b;
e[cnt].ne=H[a];
H[a]=cnt;
ds[b]++;
}
long long topo()
{
int l=1,r=0;
for(int i=1;i<=tot;i++)
{
if(!ds[i])D[++r]=i;
dp[i]=val[i];
}
long long ans=0;
while(l<=r)
{
int u=D[l++];
ans=max(ans,dp[u]);
for(int i=H[u];i;i=e[i].ne)
{
int v=e[i].to;
dp[v]=max(dp[v],dp[u]+val[v]);
ds[v]--;
if(!ds[v])D[++r]=v;
}
}
if(l<tot)return -1;
return ans;
}
int son[1000010][4],rt[400010],Tl[400010],Tr[400010];
void c(int u,int l,int r,int w,int x,int u2)
{
if(u2)add(u,u2);
if(l==r)
{
add(u,x);
return ;
}
int mid=(l+r)>>1;
if(w<=mid)
{
son[u][0]=++tot;
son[u][1]=son[u2][1];
add(u,tot);
c(tot,l,mid,w,x,son[u2][0]);
}
else
{
son[u][1]=++tot;
son[u][0]=son[u2][0];
add(u,tot);
c(tot,mid+1,r,w,x,son[u2][1]);
}
}
void jt_q(int u,int l,int r,int L,int R,int w)
{
// cout<<u<<' '<<l<<' '<<r<<endl;
if(!u||L>R||L>r||l>R)return ;
if(L<=l&&R>=r)
{
// cout<<u<<endl;
add(w,u);
return ;
}
int mid=(l+r)>>1;
jt_q(son[u][0],l,mid,L,R,w);
jt_q(son[u][1],mid+1,r,L,R,w);
}
struct node2
{
int len,id;
int l,r;
}zfc[400010];
bool cmp2(node2 a,node2 b)
{
if(a.len==b.len)return a.id<b.id;
return a.len>b.len;
}
int qr(int l,int r)
{
int k=log(r-l+1)/log(2);
return min(st[l][k],st[r-(1<<k)+1][k]);
}
int read(){
int x = 0,y = 0,c = getchar();
while(c < '0' || c > '9') y = c,c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = getchar();
return y == '-' ? -x : x;
}
int main()
{
int t;
scanf("%lld",&t);
while(t--)
{
scanf("%s",S+1);
n=strlen(S+1);
build(n);
na=read();
for(int i=1;i<=na;i++)
{
zfc[i].l=read(),zfc[i].r=read();
zfc[i].id=i,val[i]=zfc[i].len=zfc[i].r-zfc[i].l+1;
}
nb=read();
for(int i=1;i<=nb;i++)
{
zfc[i+na].l=read(),zfc[i+na].r=read();
zfc[i+na].id=i+na,zfc[na+i].len=zfc[i+na].r-zfc[i+na].l+1;
}
nm=read();
for(int i=1;i<=nm;i++)
{
int a,b;
a=read(),b=read();
add(a,b+na);
}
int len=na+nb;
tot=len;
sort(zfc+1,zfc+1+len,cmp2);
// cout<<"BA ";
int now=0;
for(int i=1;i<=len;i++)
{
// cout<<rk[zfc[i].l]<<endl;
if(zfc[i].id<=na)
{
now++;
rt[now]=++tot;
c(tot,1,n,rk[zfc[i].l],zfc[i].id,rt[now-1]);
}
else
{
// cout<<"IN";
int k=rk[zfc[i].l],l=0,r=k-1,tl=k,tr=k;
while(l<=r)
{
int mid=(l+r)>>1;
// if(zfc[i].id==1357+na)cout<<zfc[i].id<<' '<<i<<endl;
if(qr(mid+1,k)>=zfc[i].len)
{
tl=mid;
r=mid-1;
}
else l=mid+1;
}
l=k+1,r=n+1,tr=k;
while(l<=r)
{
int mid=(l+r)>>1;
if(qr(k+1,mid)>=zfc[i].len)
{
tr=mid;
l=mid+1;
}
else r=mid-1;
}
// if(tl==585&&tr==585&&zfc[i].id==1357+na)cout<<qr(585,k)<<' '<<zfc[i].len<<endl;
Tl[zfc[i].id-na]=tl,Tr[zfc[i].id-na]=tr;
jt_q(rt[now],1,n,tl,tr,zfc[i].id);
}
}
// cout<<"OUT\n";
// for(int i=1;i<=nb;i++)
// {
// cout<<Tl[i]<<' '<<Tr[i]<<'\n';
// }
cout<<topo()<<'\n';
memset(H,0,sizeof(H));
memset(e,0,sizeof(e));
memset(ds,0,sizeof(ds));
memset(dp,0,sizeof(dp));
memset(val,0,sizeof(val));
cnt=0;
}
return 0;
}
}
#undef int
int main()
{
// freopen("string9.in","r",stdin);
// freopen("out.out","w",stdout);
acac::main();
return 0;
}
开小空间RE80pts,开大了变WA60pts了qwq