#include<bits/stdc++.h>
#define f(u) (u==-1)
using namespace std;
const int N=3005;
int n,m,K;
int a[N],b[N],mp[N][N];
vector<int>edge[N];
int mat[N],vis[N];
bool dfs(int u,int p,int q)
{
for(auto &v:edge[u])
{
if(vis[v])
continue;
if((p&&!mp[p][u])||(q&&!mp[q][u]))
continue;
vis[v]=1;
if(!mat[v]||dfs(mat[v],p,q))
{
mat[v]=u;
return 1;
}
}
return 0;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>n>>m>>K;
for(int i=1;i<=n;++i)
cin>>a[i];
for(int i=1;i<=m;++i)
cin>>b[i];
for(int i=1;i<=m;++i)
for(int j=1;j<=m;++j)
if((b[j]&1)&&!(__builtin_popcount(b[i]|b[j])&1))
edge[i].emplace_back(j);
for(int i=1;i<=K;++i)
{
int u,v;
cin>>u>>v;
mp[u][v]=1;
}
int ans=0;
for(int i=1;i<=m;++i)
{
memset(vis,0,sizeof vis);
ans-=dfs(i,0,0);
}
ans+=m;
for(int i=1;i<=n;++i)
{
memset(mat,0,sizeof mat);
int cnt=0;
for(int j=1;j<=m;++j)
{
if(mp[i][j])
{
if(!(b[j]&1))
{
++cnt;
continue;
}
memset(vis,0,sizeof vis);
cnt+=(dfs(j,i,0)^1);
}
}
ans=max(ans,cnt+1);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if((a[i]^a[j])&1)
{
memset(mat,0,sizeof mat);
int cnt=0;
for(int k=1;k<=m;++k)
if(mp[i][k])
{
if(!(b[k]&1)||!mp[j][k])
{
++cnt;
continue;
}
memset(vis,0,sizeof vis);
cnt+=(dfs(k,i,j)^1);
}
ans=max(ans,cnt+2);
}
cout<<ans;
}