#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
usingnamespacestd;template<typenameT>voidread(T&w){charr;for(r=getchar();r<48||r>57;r=getchar());for(w=0;r>=48&&r<=57;r=getchar())w=w*10+r-48;}template<typenameT>inlinevoidwrite(Tw){if(w<0){putchar('-');w=-w;}if(w>9)write(w/10);putchar(char(w%10+48));}template<typenameT>voidSwap(T&a,T&b){Tt=a;a=b;b=t;}constintmaxn=500003;constintmaxm=500003;intn,m,s;structEDGE{intto,nxt;}edge[maxm<<1];intek=0;structnode{intedge1,d,f;}tree[maxn];inlinevoidaddEdge(intfrom,inttoo){++ek;edge[ek].to=too;edge[ek].nxt=tree[from].edge1;tree[from].edge1=ek;}constintmax2=20;intup[maxn][max2+1];voiddfs(intk){#define now tree[k]
for(inti=now.edge1;i;i=edge[i].nxt){intv=edge[i].to;#define son tree[v]
if(son.d==0){son.d=now.d+1;son.f=k;dfs(v);}#undef son
}#undef now
}voidinitLCA(){for(inti=1;i<=n;++i){up[i][0]=tree[i].f;}for(intk=1;k<=max2&&((1<<k)<=n);++k){for(inti=1;i<=n;++i){up[i][k]=up[up[i][k-1]][k-1];}}}intgetLCA(inta,intb){#define ta tree[a]
#define tb tree[b]
if(ta.d<tb.d)Swap(a,b);for(intk=max2;k>=0;--k){if(up[a][k])if(tree[up[a][k]].d>=tb.d)a=up[a][k];}if(a==b)returna;for(intk=max2;k>=0;--k){if(up[a][k]&&up[b][k])if(up[a][k]!=up[b][k])a=up[a][k],b=up[b][k];}returnta.f;}voidinput(){read(n),read(m),read(s);intx,y;for(inti=1;i<=n-1;++i){read(x),read(y);addEdge(x,y);addEdge(y,x);}}voidsolve(){intx,y;for(inti=1;i<=m;++i){read(x),read(y);write(getLCA(x,y));putchar('\n');}}intmain(){input();tree[s].d=1;dfs(s);initLCA();solve();return0;}