rt.
#include<bits/stdc++.h>
#define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
const int N=5e5+7;
int n,m,rt;
int u,v;
struct edge {
int to,ne;
}e[N<<1];
int head[N],cnt;
inline void addedge(int u,int v) { e[++cnt] = {v,head[u]}, head[u]=cnt ; }
int num,dfn[N];
int st[N][20];
int f[N];
void dfs(int u,int fa) {
f[u]=fa;
dfn[u]=++num;
st[num][0]=u;
for(int i=head[u];i;i=e[i].ne) {
int v=e[i].to;
if(v==fa) continue;
dfs(v,u);
}
}
inline int _min(int l,int r) {
return dfn[l]<dfn[r]?l:r;
}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#endif
sf("%d%d%d",&n,&m,&rt) ;
rep(i,1,n-1) {
sf("%d%d",&u,&v);
addedge(u,v), addedge(v,u);
}
dfs(rt,0);
int lg=__lg(n);
rep(k,1,lg) {
for(int i=1;i+(1<<k)-1<=n;i++) {
st[i][k]=_min(st[i][k-1],st[i+(1<<(k-1))][k-1]);
}
}
rep(i,1,m) {
sf("%d%d",&u,&v);
if(u==v) pf("%d\n",u);
else {
int mn=min(dfn[u],dfn[v])+1,mx=max(dfn[u],dfn[v]);
lg=__lg(mx-mn+1);
pf("%d\n",f[_min(st[mn][lg],st[mx-(1<<lg)+1][lg])]);
}
}
}