#include<bits/stdc++.h>
using namespace std;
int Read();
void add_edge(int u,int v);
int n,m,s;
struct Edge{
int nxt;
int to;
}e[1000007];
int h[500007],e_cnt;
int fa[500007];
int vis[500007];
vector<int> f_cnt[500007];//查询关系,每个点的
map<pair<int,int>,int> jud;//存储答案
vector<pair<int,int> > ans;//查询关系(题目中的)
int fi(int x){
if(x!=fa[x])fa[x]=fi(fa[x]);
return fa[x];
}
void hb(int x,int y){
fa[y]=x;
return;
}
void tarjan(int id){
vis[id]=1;
for(int i=h[id];i;i=e[i].nxt){
int to=e[i].to;
if(vis[to])continue;
tarjan(to);
hb(id,to);
}
for(int i=0;i<f_cnt[id].size();++i){
int y=f_cnt[id][i];
if(vis[y]){
jud[make_pair(id,y)]=jud[make_pair(y,id)]=fi(y);
}
}
return;
}
int main(){
n=Read();m=Read();s=Read();
for(int i=1;i<n;++i){
int x=Read(),y=Read();
add_edge(x,y);
add_edge(y,x);
}
for(int i=1;i<=m;++i){
int a=Read(),b=Read();
f_cnt[a].push_back(b);
f_cnt[b].push_back(a);
ans.push_back(make_pair(a,b));
}
for(int i=1;i<=n;++i)fa[i]=i;
tarjan(s);
for(int i=0;i<ans.size();++i){
printf("%d\n",jud[ans[i]]);
}
return 0;
}
void add_edge(int u,int v){
e[e_cnt].to=v;
e[e_cnt].nxt=h[u];
h[u]=e_cnt++;
return;
}
int Read(){
char ch=getchar();
int flag=1,res=0;
while(ch<'0'||ch>'9'){
if(ch=='-')flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
res=(res<<1)+(res<<3)+ch-'0';
ch=getchar();
}
return flag*res;
}