#include<bits/stdc++.h>
using namespace std;
const int N=500010;
int n,m,s,father[N],ans[N];
bool vis[N];
vector<int>vec[N];
vector<pair<int,int> >question[N];
int find(int);
void merge(int,int);
void Tarjan(int);
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
father[i]=i;
}
for(int i=1;i<=n-1;i++)
{
int x,y;
cin>>x>>y;
vec[x].push_back(y);
vec[y].push_back(x);
}
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
if(x==y)
{
ans[i]=x;
}
else
{
question[x].push_back(pair<int,int>(y,i));
question[y].push_back(pair<int,int>(x,i));
}
}
Tarjan(s);
for(int i=1;i<=m;i++)
{
cout<<ans[i]<<endl;
}
return 0;
}
void Tarjan(int x)
{
vis[x]=true;
for(int i=0;i<=vec[x].size()-1;i++)
{
int t=vec[x][i];
if(vis[t])
{
continue;
}
else
{
Tarjan(t);
merge(t,x);
}
}
for(int i=0;i<=question[x].size()-1;i++)
{
int t=question[x][i].first;
int number=question[x][i].second;
if(vis[t])
{
ans[number]=find(t);
}
}
}
int find(int x)
{
if(father[x]!=x)
{
father[x]=find(father[x]);
}
return father[x];
}
void merge(int x,int y)
{
int son1=find(x);
int son2=find(y);
father[son1]=son2;
}