ll n1,n2,n3,m,S,T,tot=1;
ll head[MAXN],now[MAXN],dis[MAXN];
struct node{
	ll v,w,nxt;
}e[MR<<1]; 
bool bfs(){
	FL(i,S,T) dis[i]=inf;
	queue<ll>q;
	q.push(S);
	dis[S]=0,now[S]=head[S];
	while(!q.empty()){
		ll u=q.front();
		q.pop();
		for(ll i=head[u];i;i=e[i].nxt){
			ll v=e[i].v;
			if(e[i].w&&dis[v]==inf){
				now[v]=head[v];
				dis[v]=dis[u]+1;
				q.push(v);
				if(v==T) return 1;
			}
		}
	}
	return 0;
}
ll dfs(ll u,ll flow){
	if(u==T) return flow;
	ll res=0;
	for(ll i=now[u];i&&flow;i=e[i].nxt){
		ll v=e[i].v;
		now[u]=i;
		if(e[i].w&&(dis[v]==dis[u]+1)){
			ll tmp=dfs(v,min(flow,e[i].w));
			if(!tmp) dis[v]=inf;
			e[i].w-=tmp;
			e[i^1].w+=tmp;
			res+=tmp,flow-=tmp;
		}
	}
	return res;
}
ll dinic(){
	ll res=0;
	while(bfs()) res+=dfs(S,inf);
	return res;
}
void add_edge(ll u,ll v,ll w){
	e[++tot].v=v;
	e[tot].w=w;
	e[tot].nxt=head[u];
	head[u]=tot;
}
void Add(ll u,ll v,ll w){
	add_edge(u,v,w);
	add_edge(v,u,0); 
}
ll exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){
		x=1;
		y=0;
		return a;
	}
	ll gcd=exgcd(b,a%b,x,y);
	ll tmp=x;
	x=y;
	y=tmp-a/b*y;
	return gcd;
}
int dfn[MAXN],low[MAXN],idx=0;
int s[MAXN],top=0;
int scc[MAXN],num=0;
bool vis[MAXN]; 
int in[MAXN],out[MAXN];
vector<int>G[MAXN];
void tarjan(int u){
	dfn[u]=low[u]=++idx;
	s[++top]=u;
	vis[u]=1;
	for(int v:G[u]){
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		scc[u]=++num;
		vis[u]=0;
		while(u!=s[top]) vis[s[top]]=0,scc[s[top--]]=num;
		top--;
	}
}
int dfn[MAXN],low[MAXN],idx=0;
int s[MAXN],top=0;
int num;
int f[30][MAXN];
int d[MAXN];
vector<int>G[MAXN],g[MAXN];
void tarjan(int u){
	dfn[u]=low[u]=++idx;
	s[++top]=u;
	for(int v:G[u]){
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
			if(low[v]==dfn[u]){
				num++;
				g[num].push_back(v);
				g[v].push_back(num);
				while(v!=s[top]){
					g[num].push_back(s[top]);
					g[s[top--]].push_back(num);
				}
				top--;
				g[num].push_back(u);
				g[u].push_back(num);
			}
		}
		else low[u]=min(low[u],dfn[v]);
	}
} 

struct node{
	int v,nxt;
}e[MAXN<<1];
int head[MAXN],tot=1;
int dfn[MAXN],low[MAXN],idx=0;
int s[MAXN],top=0,scc[MAXN],in[MAXN],num=0;
void add(int u,int v){
	e[++tot].v=v;
	e[tot].nxt=head[u];
	head[u]=tot;
}
void tarjan(int u,int eid){
	dfn[u]=low[u]=++idx;
	s[++top]=u;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(!dfn[v]){
			tarjan(v,i);
			low[u]=min(low[u],low[v]);
		}
		else if(i!=(eid^1)) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		scc[u]=++num;
		while(u!=s[top]) scc[s[top--]]=num;
		top--;
	}
}
ll n,q,rt;
ll f[30][MAXN],lg[MAXN];
ll dep[MAXN],h[MAXN],son[MAXN];
ll top[MAXN];
vector<ll>G[MAXN],Up[MAXN],Down[MAXN];
void dfs1(ll u,ll fth){
	h[u]=dep[u]=dep[fth]+1;
	f[0][u]=fth;
	FL(i,1,29) f[i][u]=f[i-1][f[i-1][u]];
	for(ll v:G[u]){
		if(v==fth) continue;
		dfs1(v,u);
		h[u]=max(h[u],h[v]);
		if(h[v]>h[son[u]]) son[u]=v; 
	}
}
void dfs2(ll u,ll tp){
	top[u]=tp;
	if(u==tp){
		ll x=u;
		FL(i,0,h[u]-dep[u]) Up[u].push_back(x),x=f[0][x];
		x=u;
		FL(i,0,h[u]-dep[u]) Down[u].push_back(x),x=son[x];
	}
	if(son[u]) dfs2(son[u],tp);
	for(ll v:G[u]){
		if(v==f[0][u]||v==son[u]) continue;
		dfs2(v,v);
	}
}
ll ask(ll x,ll k){
	if(!k) return x;
	x=f[lg[k]][x];
	k-=(1<<lg[k]);
	k-=(dep[x]-dep[top[x]]);
	x=top[x];
	return ((k>=0)?Up[x][k]:Down[x][-k]);
}