#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct nod
{
int index;
int bianhao;
};
nod fa[100010000];
int n, m, p, q;
void init()
{
int maxn=max(m,n);
int k = 0;
int sum = -maxn;
for (int i = 1; i <= 2*maxn; i++)
{
fa[i].bianhao = sum;
sum++;
fa[i].index = i;
}
}
int find_(int x)
{
if (x == fa[x].index)
return x;
else
return fa[x].index = find_(fa[x].index);
}
void emerge_(int a, int b)
{
int fx = find_(a), fy = find_(b);
if (fx != fy)
fa[fx].index = fy;
}
int main()
{
while (scanf("%d %d %d %d", &n, &m, &p, &q)!=EOF)
{
int maxn = max(n, m);
init();
int flag = 1;
for (int i = 1; i <= p; i++)
{
int a, b;
cin >> a >> b;
int index1, index2;
for (int i = 1; i <= 2 * maxn; i++)
{
if (a == fa[i].bianhao)
index1 = i;
if (b == fa[i].bianhao)
index2 = i;
}
emerge_(index1, index2);
if (a < 0)
flag = 0;
}
for (int i = 1; i <= q; i++)
{
int a, b;
cin >> a >> b;
int index1, index2;
for (int i = 1; i <= 2 * maxn; i++)
{
if (a == fa[i].bianhao)
index1 = i;
if (b == fa[i].bianhao)
index2 = i;
}
emerge_(index1, index2);
}
int index1, index2;
for (int i = 1; i <= 2 * maxn; i++)
{
if (-1 == fa[i].bianhao)
index1 = i;
if (1 == fa[i].bianhao)
index2 = i;
}
emerge_(index1, index2);
long long sumgirl = 0;
long long sumboy = 0;
for (int i = 1; i <= 2 * maxn; i++)
{
int x=find_(i),y=find_(index2);
if (find_(i) == find_(index2))
{
if (fa[i].bianhao < 0)
sumgirl++;
else if (fa[i].bianhao > 0)
sumboy++;
else;
}
}
long long minm = min(sumgirl, sumboy);
cout << minm << endl;
}
}