#include <iostream> // cout, endl, cin
#include <vector> // vector
using namespace std;

int main() {

	int N, M;
	cin >> N >> M;

	vector<int> A(M), B(M);
	for (int i = 0; i < M; i++) {
		cin >> A.at(i) >> B.at(i);
	}
	
	int K;
	cin >> K;

	vector<int> C(K), D(K);
	for (int i = 0; i < K; i++) {
		cin >> C.at(i) >> D.at(i);
	}

	int K2 = 1 << K;
	int ans = 0;

	for (int s = 0; s < K2; s++) {

		vector<int> dish(N + 1);

		for (int i = 0; i < K; i++) {
			if ((s >> i) & 1) {
				dish.at(D.at(i))++;
			}
			else {
				dish.at(C.at(i))++;
			}
		}

		int cnt = 0;

		for (int i = 0; i < M; i++) {
			if (dish.at(A.at(i)) == 0) {
				continue;
			}
			if (dish.at(B.at(i)) == 0) {
				continue;
			}
			cnt++;
		}
		ans = max(ans, cnt);
	}
	cout << ans << endl;
}

#include<bits/stdc++.h>
#define all(x) (x).begin(),(x).end()
#define ll long long
#define rep(i,n) for(int i = 0; i < int(n); i++)
#define vi vector<int>
using namespace std;
const int INF = 1001001001;
const int MOD = 1e9+7;
template<class T> inline bool chmax(T &a, const T &b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T &a, const T &b){ if(b<a){ a=b; return 1; } return 0; }
int solve(){
  cin.tie(0), ios::sync_with_stdio(false);
  int n,m; cin >> n >> m;
  vi a(m),b(m); rep(i,m) cin >> a[i] >> b[i];
  int k; cin >> k;
  vi c(k),d(k); rep(i,k) cin >> c[i] >> d[i];
  int ans = 0;
  rep(bit,1<<k){
    vi table(n+1);
    rep(i,k){
      if(bit>>i&1){
        table[c[i]]++;
      }else{
        table[d[i]]++;
      }
    }
    int res = 0;
    rep(i,m) if(table[a[i]] && table[b[i]]) res++;
    chmax(ans,res);
  }
  return ans;
}
int main(){
  cout << solve() << endl;
  return 0;
}
