救命!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 5e5+10;
struct E{
int next,to,num;
}e1[N*2],e2[N*2];
int head1[N],head2[N];
int cnt1,cnt2,top;
int n,m,st,fa[N],vis[N];
int ans[N];
void add1(int u,int to){
e1[++cnt1].next =head1[u];
e1[cnt1].to =to;
head1[u]=cnt1;
}
void add2(int u,int to){
e2[++cnt2].next =head2[u];
e2[cnt2].to =to;
e2[cnt2].num =top;
head2[u]=cnt2;
}
int find(int x){
if(fa[x]!=x){
fa[x]=find(fa[x]);
}
return fa[x];
}
void tarjan(int u,int father){
for(int i=head1[u];i;i=e1[i].next ){
int v=e1[i].to ;
if(v==father)continue;
tarjan(v,u);
int tx=find(u);
int ty=find(v);
fa[ty]=tx;
vis[v]=1;
}
for(int i=head2[u];i;i=e2[i].next ){
int v=e2[i].to ;
if(v==father)continue;
if(vis[v]){
ans[e2[i].num ]=find(v);
}
}
}
int main(){
// freopen("123.txt","r",stdin);
cin>>n>>m>>st;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
add1(x,y);
add1(y,x);
}
for(top=1;top<=m;top++){
int x,y;
cin>>x>>y;
add2(x,y);
add2(y,x);
}
tarjan(st,st);
for(int i=1;i<=m;i++){
cout<<ans[i]<<endl;
}
}