#include #include using namespace std; using namespace atcoder; using ll=long long; const int MAXN=100; const int MAXK=100; const int INF=1e6; int n, k, vn[MAXN][MAXN], vk[MAXK], ordn[MAXN][MAXN], ordk[MAXK]; vector gn[MAXN], gk[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); } { queue que; que.push(0); bool used[MAXK]={}; used[0]=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; } } } string ts[MAXK]; int tk[MAXK]; vector vss(k); for(int i=k-1; i>=0; i--){ int x=vk[i]; vector vs; for(auto y:gk[x]){ if(ordk[y] vss2; string tsn[MAXN][MAXN]; int tn[MAXN][MAXN]; for(int r=0; r que; que.push(r); bool used[MAXN]={}; used[r]=1; int t=0; while(!que.empty()){ int x=que.front(); que.pop(); ordn[r][x]=t; vn[r][t++]=x; for(auto y:gn[x]){ if(used[y]) continue; que.push(y); used[y]=1; } } for(int i=n-1; i>=0; i--){ int x=vn[r][i]; vector vs; for(auto y:gn[x]){ if(ordn[r][y]> dp(vss.size(), vector(vss2.size(), -INF)); vector> ok(vss.size(), vector(vss2.size())); int ans=-INF; for(int r=0; r=0; i--){ for(int j=k-1; j>=0; j--){ if(!(i==0 && j==0) && ok[tk[j]][tn[r][i]]) continue; int x=vn[r][i], y=vk[j], j1=tk[j], i1=tn[r][i]; ok[j1][i1]=1; for(auto z:gn[x]){ if(ordn[r][z]0) n1--; if(j>0) k1--; if(k1>n1) continue; mcf_graph g(k1+n1+2); int s=k1+n1, t=s+1; for(int l=0; l