#if defined(_USE_PCH_)
#include "pch.hpp"
#else
#include <bits/stdc++.h>
#endif
#define RNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_<=V_##_END; V_++)
#define IRNG(V_, A_, B_) for(int V_=(A_), V_##_END=(B_); V_>=V_##_END; V_--)
#ifdef _WIN32
#define long __int64
#endif
using namespace std;
const int MAXN=5e4+10,INF=0x3f3f3f3f;
int nnd;
struct Dinic{
static const int MAXN=::MAXN*8,MAXM=1e6+10;
struct { int v,nxt,f; long c; } E[MAXM]; int head[MAXN],ned=1,in[MAXN],out[MAXN];
int st0,ed0,st1,ed1;
int cur[MAXN]; long dis[MAXN]; bool vis[MAXN];
int totflow; long mincost;
bool flag;
void reset(){
st0=ed0=st1=ed1=0;
fill(head,head+nnd+1,0);
fill(in,in+nnd+1,0);
fill(out,out+nnd+1,0);
nnd=0;
ned=1;
mincost=totflow=0;
flag=1;
}
void _add0(int u,int v,int f,long c){ E[++ned]={v,head[u],f,c},head[u]=ned; }
void _add(int u,int v,int f,long c){
_add0(u,v,f,c),_add0(v,u,0,-c);
}
void add(int u,int v,int l,int r,long c){
cerr<<u<<" "<<v<<" "<<l<<","<<r<<","<<c<<"\n";
_add(u,v,r-l,c);
out[u]+=l,in[v]+=l; mincost+=l*c;
if(l>r)
flag=0;
}
void build(){
_add(ed1,st1,INF,0);
st0=++nnd,ed0=++nnd;
RNG(u,0,nnd-2){
if(in[u]>out[u]) _add(st0,u,in[u]-out[u],0);
else if(out[u]>in[u]) _add(u,ed0,out[u]-in[u],0);
}
}
bool spfa(){
fill(dis,dis+nnd+1,INF); dis[st0]=1;
queue<int> q; q.push(st0);
while(q.size()){
int u=q.front(); q.pop();
vis[u]=0;
for(int i=head[u]; i; i=E[i].nxt){
int v=E[i].v;
if(E[i].f&&dis[v]>dis[u]+E[i].c){
dis[v]=dis[u]+E[i].c;
if(!vis[v]) vis[v]=1,q.push(v);
}
}
}
return dis[ed0]<INF;
}
pair<int,long> dfs(int u,int flow){
if(u==ed0||!flow) return {flow,0};
int ret=0; long retv=0;
for(int i=cur[u]; i&&flow; cur[u]=i=E[i].nxt){
int v=E[i].v;
if(E[i].f&&dis[v]==dis[u]+E[i].c){
auto [x,y]=dfs(v,min(flow,E[i].f));
if(!x) dis[v]=INF;
ret+=x,flow-=x,E[i].f-=x,E[i^1].f+=x;
retv+=y+x*E[i].c;
}
}
return {ret,retv};
}
void dinic(){
while(spfa()){
copy(head,head+nnd+1,cur);
auto [x,y]=dfs(st0,INF);
totflow+=x,mincost+=y;
}
}
} F;
int n,m,qn,in[MAXN],out[MAXN]; vector<int> G[MAXN];
int dfn[MAXN],low[MAXN],dfnc=0; int stk[MAXN],stkp; bool instk[MAXN];
int blk[MAXN],nblk,bin[MAXN],bout[MAXN];
long c1,c2; bool flag;
void tarjan(int u){
dfn[u]=low[u]=++dfnc;
stk[++stkp]=u,instk[u]=1;
for(auto v:G[u]){
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
} else if(instk[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int c=++nblk;
for(int v; (v=stk[stkp--])!=u; ) blk[v]=c,instk[v]=0;
blk[u]=c,instk[u]=0;
}
}
struct{
int l,r;
void upd(int l1,int r1){ l=max(l,l1),r=min(r,r1); }
} lim[2][MAXN][2];
int id[2][MAXN][2][2];
void case_main(){
cin>>n>>m>>qn;
fill(in+1,in+n+1,0),fill(out+1,out+n+1,0);
fill(bin+1,bin+n+1,0),fill(bout+1,bout+n+1,0);
memset(lim,0,sizeof(lim));
RNG(i,1,n) G[i].clear();
RNG(_,1,m){
int u,v; cin>>u>>v;
G[u].push_back(v),in[v]++,out[u]++;
}
dfnc=nblk=0;
fill(dfn+1,dfn+n+1,0);
RNG(i,1,n){
if(!dfn[i]) tarjan(i);
}
cin>>c1>>c2;
if(c1>c2) swap(c1,c2),flag=1;
else flag=0;
RNG(i,1,n){
lim[0][i][0].r=in[i],lim[0][i][1].r=out[i];
lim[1][blk[i]][0].r+=in[i],lim[0][blk[i]][1].r+=out[i];
bin[blk[i]]+=in[i],bout[blk[i]]+=out[i];
}
RNG(_,1,qn){
int tp,u,t,l,r; cin>>tp>>u>>t>>l>>r;
int k=(tp==1?bout[u]:tp==2?bin[u]:tp==3?out[u]:in[u]);
if(flag?t==2:t==1) swap(l,r),l=k-l,r=k-r;
lim[tp<=2][tp<=2?blk[u]:u][tp&1].upd(l,r);
}
F.reset();
int st=F.st1=++nnd,ed=F.ed1=++nnd;
RNG(i,1,nblk){
id[1][i][0][0]=++nnd,id[1][i][1][0]=++nnd;
F.add(st,id[1][i][0][0],lim[1][i][1].l,lim[1][i][1].r,0);
F.add(id[1][i][1][0],ed,lim[1][i][0].l,lim[1][i][0].r,0);
}
RNG(i,1,n){
id[0][i][0][0]=++nnd,id[0][i][0][1]=++nnd,id[0][i][1][0]=++nnd,id[0][i][1][1]=++nnd;
F.add(id[1][blk[i]][0][0],id[0][i][0][0],0,INF,0);
F.add(id[0][i][0][0],id[0][i][0][1],lim[0][i][0].l,lim[0][i][0].r,0);
F.add(id[0][i][1][0],id[0][i][1][1],lim[0][i][1].l,lim[0][i][1].r,0);
F.add(id[0][i][1][1],id[1][blk[i]][1][0],0,INF,0);
for(auto v:G[i]) F.add(id[0][i][0][1],id[1][v][1][0],0,1,c2-c1);
}
if(!F.flag){ cout<<-1<<"\n"; return; }
F.dinic();
cout<<F.mincost<<"\n";
}
int main(){
#if defined(_LOCAL_)
freopen("in","r",stdin);
// freopen("out","w",stdout);
#else
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
#endif
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int cas; cin>>cas;
RNG(_,1,cas) case_main();
}