#include <bits/stdc++.h>
using namespace std;
vector<int> root;
vector<int> sz;
int GetRoot(int x) {
  if (root[x] == x) return x;
  root[x] = GetRoot(root[x]);
  return root[x];
}
void Union(int x, int y) {
  x = GetRoot(x);
  y = GetRoot(y);
  if (x == y) return;
  if (sz[x] > sz[y]) {
    sz[y] += sz[x];
    root[x] = y;
  } else {
    sz[x] += sz[y];
    root[y] = x;
  }
}
int main() {
  int n;
  cin >> n;
  sz.assign(n, 1);
  root.assign(n, 0);
  for (int i = 0; i < n; i++) root[i] = i;
  int k;
  cin >> k;
  while (k--) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    Union(u, v);
  }
  int m;
  cin >> m;
  while (m--) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    if (GetRoot(u) == GetRoot(v)) sz[GetRoot(u)] = 0;
  }
  int ans{0};
  for (int i = 0; i < n; i++) ans = max(ans, sz[GetRoot(i)]);
  cout << ans;
  return 0;
}
