#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();
}