#include <bits/stdc++.h>
using namespace std;
struct dsu {
  vector<int> p, siz;
  int get(int x) {
    if (p[x] == x) return x;
    return p[x] = get(p[x]);
  }
  bool same(int x, int y) {
    x = get(x), y = get(y);
    return x == y;
  }
  void unite(int x, int y) {
    x = get(x), y = get(y);
    if (x == y) return;
    if (siz[x] < siz[y]) swap(x, y);
    p[y] = x;
    siz[x] += siz[y];
  }
  dsu(int n) {
    siz.resize(n, 1);
    p.resize(n);
    for (int i = 0; i < n; i++) p[i] = i;
  }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, k;
  cin >> n >> k;
  dsu d(n);
  for (int i = 0; i < k; i++) {
    int x, y;
    cin >> x >> y;
    --x;
    --y;
    d.unite(x, y);
  }
  int m;
  cin >> m;
  vector<bool> bad(n);
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    --x;
    --y;
    if (d.same(x, y)) {
      bad[d.get(x)] = true;
    }
  }
  int ans = 0;
  for (int i = 0; i < n; i++) {
    if (!bad[d.get(i)]) {
      ans = max(ans, d.siz[d.get(i)]);
    }
  }
  cout << ans;
}
