#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define vec vector
const int N = 200005;
int mod = 998244353;
void solve(){
int n,root,m;cin>>n>>m>>root;
vec<vec<int>>g(n+1,vec<int>(0));
int u,v;
for(int i=1;i<n;i++){
cin>>v>>u;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
vec<int>idx(n+1,0),deep(n+1,0),f(n+1);
int cnt=0;
int maxlg=__lg(n);
vec<vec<int>>rmq(n+1,vec<int>(maxlg+1));
vec<int>lg(n+1,0);
function<void(int,int)>get_dfn=[&](int no,int fa){
idx[no]=++cnt;
rmq[cnt][0]=no;
deep[no]=deep[fa]+1;
f[no]=fa;
for(int so:g[no]){
if(so==fa)continue;
get_dfn(so,no);
}
};
get_dfn(root,0);
for(int i=0;i<=maxlg;i++)lg[1<<i]=i;
for(int i=3;i<=n;i++)
if(lg[i]==0)
lg[i]=lg[i-1];
int le=1;
for(int len=1;len<=maxlg;len++){
for(int i=1;i+le*2-1<=n;i++){
u=rmq[i][len-1];v=rmq[i+le][len-1];
if(deep[u]<deep[v])rmq[i][len]=u;
else rmq[i][len]=v;
}
}
function<int(int,int)>get_lca=[&](int x,int y){
if(x==y)return x;
if(idx[x]>idx[y])swap(x,y);
int ml=lg[idx[y]-idx[x]];
u=rmq[idx[x]+1][ml];v=rmq[idx[y]-(1<<ml)+1][ml];
if(deep[u]<deep[v])return f[u];
return f[v];
};
while(m--){
int q,w;cin>>q>>w;
cout<<get_lca(q,w)<<"\n";
}
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
int _=1;
for(int i=1;i<=_;i++){
solve();
}
return 0;
}