#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <string>
#include <cmath>
#include <bitset>
#include <stack>
#include <unordered_set>
#define ull unsigned long long
#define ll long long
#define pii pair<ll ,ll>
#define ft first
#define sd second
#define pr pair
#define cy cout<<"Yes"<<endl
#define cn cout<<"No"<<endl
#define forn(i,n) for(int (i)=0;(i)<(n);(i)++)
#define forne(i,n) for(int (i)=1;(i)<=(n);(i)++)
#define rforn(i,n) for(int (i)=(n-1);(i)>=(0);(i)--)
#define rforne(i,n) for(int (i)=(n);(i)>=(1);(i)--)
#define vv vector
const int inf = 0x004f4f4f;
const int N = 1e6 + 10;
int T;
void solve() {
int n, m, s;
vv<int>d;
int f[N][30];
vv<vv<int>>tree;
cin >> n >> m >> s;
tree.resize(n + 1, vv<int>());
auto dfs = [&f,&tree,&d](auto&& dfs, int u, int fa)->void {
d[u] = d[fa] + 1;
f[u][0] = fa;
for (int i = 1; i < 30; i++)
f[u][i] = f[f[u][i - 1]][i - 1];
for (auto a : tree[u])
if (a != fa)
dfs(dfs, a, u);
};
auto query = [&tree,&f,&d](int x, int y)->int {
if (d[x] < d[y])swap(x, y);
for (int i = 29; i >= 0; i--)
if (d[f[x][i]] >= d[y])
x = f[x][i];
if (x == y)
return y;
for (int i = 29; i >= 0; i--) {
if (f[x][i] != f[y][i])
x = f[x][i], y = f[y][i];
}
return f[x][0];
};
forn(i, n - 1) {
int a, b; cin >> a >> b;
tree[a].push_back(b);
tree[b].push_back(a);
}
d.resize(n + 1);
d[s] = 0;
d[0] = -1;
dfs(dfs, s, 0);
forn(i, m) {
int a, b; cin >> a >> b;
cout << query(a, b) << endl;
}
}
int main() {
T = 1;
while (T--)
solve();
return 0;
}