#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f
int son[INF],fa[INF],size[INF],dep[INF],cnt,head[INF];
int top[INF],n,m,q;
int read()
{
int x = 0;
char y = getchar();
while(y<'0'||y>'9') y = getchar();
while(y>='0'&&y<='9')
{
x = x*10 + y -'0';
y = getchar();
}
return x;
}
struct edge{
int v;
int next;
}e[INF];
void add(int u,int v)
{
e[++cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
return;
}
void dfs(int u,int f)
{
size[u] = 1;
dep[u] = dep[f] + 1;
for(int i = head[u];i;i = e[i].next)
if(e[i].v != f)
{
fa[e[i].v] = u;
dfs(e[i].v,u);
size[u] += size[e[i].v];
if(size[e[i].v] > size[son[u]])
{
son[u] = e[i].v;
}
}
return;
}
void dfs2(int x,int tp)
{
top[x] = tp;
if(son[x]) dfs2(son[x],tp);
for(int i=head[x];i;i = e[i].next)
{
if(e[i].v!=fa[x]&&e[i].v != son[x])
{
dfs2(e[i].v,e[i].v);
}
}
return;
}
int lca(int x,int y)
{
while(top[x] != top[y])
{
if(dep[top[x]] < dep[top[y]]){
swap(x,y);
}
x = fa[x];
}
return dep[x]<dep[y]?x:y;
}
int main()
{
n = read(),q = read(),m = read();
for(int i=1;i<n;i++){
int x;int y;
x = read(),y = read();
add(x,y);
add(y,x);
}
dep[m] = -1;
dfs(m,m);
dfs2(m,m);
for(int i=1;i<=q;i++)
{
int x,y;
x = read(),y = read();
cout<<lca(x,y)<<endl;
}
return 0;
}