#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
int T,n,m,k,q,x,y,ans;
int n1,n2,n3,n4,m1,m2,m3;
unordered_map<int,int>mp;
vector<int>G2[N],G3[N],G4[N];
int a[N],b[N],c[N],d[N];
int cost2[N],cost3[N],cost4[N];
struct seg_tree {
    int mi[N*4];
    void pushup(int i) {
        mi[i]=min(mi[i*2],mi[i*2+1]);
    }
    void build(int i,int l,int r,int *a) {
        mi[i]=1e9;
        if(l==r) {
            mi[i]=a[l];
            return ;
        }
        int mid=(l+r)/2;
        build(i*2,l,mid,a);
        build(i*2+1,mid+1,r,a);
        pushup(i);
    }
    void update(int i,int l,int r,int pos,int v) {
        if(l==r) {
            mi[i]=v;
            return ;
        }
        int mid=(l+r)/2;
        if(pos<=mid)update(i*2,l,mid,pos,v);
        else update(i*2+1,mid+1,r,pos,v);
        pushup(i);
    }
    int query(int i,int l,int r,int ql,int qr) {
        if(ql<=l&&qr>=r) {
            return mi[i];
        }
        int mid=(l+r)/2;
        int ans=1e9;
        if(ql<=mid)ans=min(ans,query(i*2,l,mid,ql,qr));
        if(qr>mid)ans=min(ans,query(i*2+1,mid+1,r,ql,qr));
        return ans;



    }




} ac;
int main() {
    scanf("%d%d%d%d",&n1,&n2,&n3,&n4);
    for(int i=1; i<=n1; i++)scanf("%d",&a[i]);
    for(int i=1; i<=n2; i++)scanf("%d",&b[i]);
    for(int i=1; i<=n3; i++)scanf("%d",&c[i]);
    for(int i=1; i<=n4; i++)scanf("%d",&d[i]);
    scanf("%d",&m1);
    for(int i=1,u,v; i<=m1; i++) {
        scanf("%d%d",&u,&v);
        G2[v].push_back(u);
    }
    scanf("%d",&m2);
    for(int i=1,u,v; i<=m2; i++) {
        scanf("%d%d",&u,&v);
        G3[v].push_back(u);
    }
    scanf("%d",&m3);
    for(int i=1,u,v; i<=m3; i++) {
        scanf("%d%d",&u,&v);
        G4[v].push_back(u);
    }
    //cout<<"ok"<<endl;
    ac.build(1,1,n1,a);
    for(int i=1; i<=n2; i++) {
        for(int j:G2[i])ac.update(1,1,n1,j,1e9);
        cost2[i]=ac.query(1,1,n1,1,n1)+b[i];
        for(int j:G2[i])ac.update(1,1,n1,j,a[j]);
       // cout<<"cost2:"<<i<<" "<<cost2[i]<<endl;
    }


    ac.build(1,1,n2,cost2);
    for(int i=1;i<=n3;i++){
        for(int j:G3[i])ac.update(1,1,n2,j,1e9);
        cost3[i]=ac.query(1,1,n2,1,n2)+c[i];
        for(int j:G3[i])ac.update(1,1,n2,j,cost2[j]);
       // cout<<"cost3:"<<i<<" "<<cost3[i]<<endl;
    }
    int ans=1e9;
    ac.build(1,1,n3,cost3);
    for(int i=1;i<=n4;i++){
        for(int j:G4[i])ac.update(1,1,n3,j,1e9);
        cost4[i]=ac.query(1,1,n3,1,n3)+d[i];
        for(int j:G4[i])ac.update(1,1,n3,j,cost3[j]);
        ans=min(ans,cost4[i]);
    }
    if(ans==1e9)ans=-1;
    printf("%d\n",ans);






}
/*

*/
