#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 10001
using namespace std;
int read(){
int x=0;
char e=getchar();
while(e<'0'||e>'9') e=getchar();
while(e>='0'&&e<='9'){
x=x*10+e-'0';
e=getchar();
}
return x;
}
int n,m,p,q,f[maxn],f_[maxn],ans;
int cnt_1,cnt_2;
int find(int x){
return f[x]=x?f[x]:f[x]=find(f[x]);
}
int find_(int x){
return f_[x]=x?f_[x]:f_[x]=find(f_[x]);
}
int main(){
n=read(),m=read(),p=read(),q=read();
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++) f_[i]=i;
for(int i=1;i<=p;i++){
int fx=find(read()),fy=find(read());
if(fx!=fy) f[max(fx,fy)]=min(fx,fy);
}
for(int i=1;i<=q;i++){
int fx=find_(read()),fy=find_(read());
if(fx!=fy) f_[max(fx,fy)]=min(fx,fy);
}
for(int i=1;i<=n;i++){
// cout<<f[i]<<" ";
if(f[i]==1) cnt_1++;
}
for(int i=1;i<=m;i++){
// cout<<f_[i]<<" ";
if(f_[i]==1) cnt_2++;
}
// printf("\n%d %d",cnt_1,cnt_2);
printf("%d",min(cnt_1,cnt_2));
return 0;
}