#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; using namespace atcoder; typedef long long ll; typedef pair P; template struct hungarian{//n<=m const T inf=numeric_limits::max(); int n, m, max_match, root; T max_cost; vector> cost; vector lx, ly, slack; vector xy, yx, prev, slackx; vector s, t; void update_labels(){ T delta=inf; for(int y=0; y que; for(int x=0; x> &cost):max_match(0), max_cost(0), cost(cost), n(cost.size()), m(cost[0].size()), lx(n, -inf), ly(m), xy(n, -1), yx(m, -1), s(n), t(m), prev(n), slack(m), slackx(m){ for(int x=0; x gn[MAXN], gk[MAXK]; int vn[MAXN], vk[MAXK], ordn[MAXN], ordk[MAXK]; ll dp[MAXN][MAXK], dp2[MAXN][MAXK]; int main() { cin>>k; for(int i=0; i>a>>b; a--; b--; gk[a].push_back(b); gk[b].push_back(a); } cin>>n; for(int i=0; i>a>>b; a--; b--; gn[a].push_back(b); gn[b].push_back(a); } int rn=0, rk=0; for(int i=0; ign[rn].size()) rn=i; for(int i=0; igk[rk].size()) rk=i; { queue que; que.push(rk); bool used[MAXK]={}; used[rk]=1; int t=0; while(!que.empty()){ int x=que.front(); que.pop(); ordk[x]=t; vk[t++]=x; for(auto y:gk[x]){ if(used[y]) continue; que.push(y); used[y]=1; } } } { queue que; que.push(rn); bool used[MAXN]={}; used[rn]=1; int t=0; while(!que.empty()){ int x=que.front(); que.pop(); ordn[x]=t; vn[t++]=x; for(auto y:gn[x]){ if(used[y]) continue; que.push(y); used[y]=1; } } } for(int i=0; i=0; i--){ for(int j=k-1; j>=0; j--){ int x=vn[i], y=vk[j]; for(auto z:gn[x]){ if(ordn[z]0) n1--; if(j>0) k1--; if(k1>n1) continue; vector> cost(k1, vector(n1, -INF)); int i1=0; for(auto z:gn[x]){ if(ordn[z] h(cost); mx=h.max_cost; } dp[i][j]=max(dp[i][j], mx); } } ll ans=-INF; for(int i=0; i> st; st.insert({-INF, -1}); for(auto z:gn[x]){ if(ordn[z]first); st.insert({dp[ordn[z]][j]+1, z}); } int n1=gn[x].size(), k1=gk[y].size(); if(j>0) k1--; if(k1>n1) continue; if(k1==0){ for(auto z:gn[x]){ if(ordn[z]> cost0(k1, vector(n1, -INF)); vector myon(n1); int i1=0; for(auto z:gn[x]){ int j1=0; for(auto w:gk[y]){ if(ordk[w] h0(cost0); ans=max(ans, h0.max_cost); continue; } for(int l=0; l h(cost); dp2[ordn[z0]][j]=max(dp2[ordn[z0]][j], h.max_cost); } } } if(ans<0){ cout<<-1<