//2023/7/2
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//看看数组开的够不够大
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int num;
int fa[MAXN],vis[MAXN];
vector<vector<int>> vec;
int head[MAXN];
map<pair<int,int>,int> mp;
struct linkstar{
int to,from,w,next;
}edge[2*MAXN];
int escnt=0;
void add(int from,int to)
{
edge[++escnt].from=from;
edge[escnt].to=to;
edge[escnt].next=head[from];
head[from]=escnt;
}
int find(int x)
{
if(x==fa[x]) return x;
else return fa[x]=find(fa[x]);
}
void lca(int x,int y)
{
//cout<<x<<" "<<y<<" "<<find(y)<<endl;
mp[make_pair(x,y)]=find(y);
mp[make_pair(y,x)]=find(y);
}
void tarjan(int u)
{
vis[u]=1;
for (int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(!vis[v]){
tarjan(v);
fa[v]=u;
}
}
for (int i:vec[u]){
if(vis[i]==2) lca(u,i);
}
vis[u]=2;
}
vector<pair<int,int>> ans;
int main()
{
memset(head,-1,sizeof(head));
int n,m,s,u,v;
cin>>n>>m>>s;
vec.resize(n+1);
for (int i=1;i<=n-1;i++){
cin>>u>>v;
add(u,v);
add(v,u);
fa[i]=i;
}
fa[n]=n;
for (int i=1;i<=m;i++){
cin>>u>>v;
ans.push_back(make_pair(u,v));
vec[u].push_back(v);
vec[v].push_back(u);
}
tarjan(s);
for (int i=0;i<ans.size();i++){
int u=ans[i].first;
int v=ans[i].second;
cout<<mp[make_pair(u,v)]<<'\n';
}
return 0;
}