#include<bits/stdc++.h>
#define UP(i,a,b) for(int i=a;i<=b;i++)
#define DN(i,a,b) for(int i=a;i>=b;i--)
const int M=500005;
using namespace std;
int n,m,s;
int fa[M][20];
int deep[M];
int lg[M];
bool vis[M];
vector<int> edge[M];
template<typename T> inline void read(T & r)
{
char m=1;
char c=getchar();
r=0;
for(;!isdigit(c);c=getchar())
{
if(c=='-');
m=-1;
}
for(;isdigit(c);c=getchar())
r=(r<<3)+(r<<1)+(c^48);
r*=m;
}
template<typename T> inline void write(T r)
{
if(r>9) write(r/10);
putchar(r%10+'0');
puts("");
}
template<typename T> inline void dfs(T s,T f)
{
int t=0;
fa[s][0]=f;
vis[s]=1;
deep[s]=deep[f]+1;
t=deep[s];
UP(i,1,t) fa[s][i]=fa[fa[s][i-1]][i-1];
UP(i,0,edge[s].size()-1)
{
int v=edge[s][i];
if(v!=f) dfs(v,s);
}
return;
}
template<typename T> inline int LCA(T u,T v)
{
if(deep[u]<deep[v]) swap(u,v);
while(deep[u]>deep[v])
{
int g=lg[deep[u]-deep[v]];
u=fa[u][g];
}
if(u==v) return u;
DN(i,lg[deep[u]],0)
{
if(fa[u][i]!=fa[v][i])
{
u=fa[u][i];
v=fa[v][i];
}
}
return fa[u][0];
}
int main()
{
//freopen("P3379_1.in","r",stdin);
read(n);read(m);read(s);
UP(i,1,n-1)
{
int u,v;
read(u);read(v);
edge[u].push_back(v);
edge[v].push_back(u);
}
int j=2,k=0;
UP(i,1,(n<<1)-1)
{
if(i==j)
{
j<<=1;
k++;
}
lg[i]=k;
}
dfs(s,0);
UP(i,1,m)
{
int a,b;
cin>>a>>b;
write(LCA(a,b));
}
return 0;
}