#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1e5;
struct bcj{
int f[N];
int get(int x){
if (x==f[x]) return x;
return f[x]=get(f[x]);
}
int query(int x,int y){
return get(x)==get(y);
}
void insert(int x,int y){
f[get(x)]=get(y);
}
void memsets(int n){
for (int i=1;i<=n;++i) f[i]=i;
}
}t;
struct rec{
int e,nex;
}z[N*2];
int en,fi[N];
void add(int s,int e){
z[++en].e=e;
z[en].nex=fi[s];
fi[s]=en;
}
int n,m,rt;
vector<int>id[N],cp[N];
int ans[N];
void query_id(int s,int e,int i){
id[s].push_back(i);id[e].push_back(i);
cp[s].push_back(e);cp[e].push_back(s);
}
void init(){
scanf("%d%d%d",&n,&m,&rt);
for (int i=1;i<n;++i){
int s,e;
scanf("%d%d",&s,&e);
add(s,e);add(e,s);
}
for (int i=1;i<=m;++i){
int s,e;
scanf("%d%d",&s,&e);
query_id(s,e,i);
}
t.memsets(n);
}
int vis[N];
void tarjan(int x,int fa){
vis[x]=1;
for (int i=fi[x];i!=0;i=z[i].nex){
if (z[i].e==fa) continue;
tarjan(z[i].e,x);
t.insert(z[i].e,x);
}
int len=cp[x].size();
int u,lca;
for (int i=0;i<len;++i){
u=cp[x][i];
if (vis[u]!=2) continue;
lca=t.get(u);
if (ans[id[x][i]]!=0) continue;
ans[id[x][i]]=lca;
}
vis[x]=2;
}
void print(){
for (int i=1;i<=m;++i) printf("%d\n",ans[i]);
}
int main(){
init();
tarjan(rt,0);
print();
return 0;
}