#include <bits/stdc++.h>
using namespace std;
//
const int maxN = 7e4;

int N, Q, h[maxN] = {0}, up[maxN][20];
vector<int> edge[maxN];
//
void DFS (int u)
{
    for (int v : edge[u])
    {
        if (v == up[u][0])
            continue;
        h[v] = h[u] + 1;
        up[v][0] = u;
        for (int i = 1; i < 20; ++i)
            up[v][i] = up[up[v][i - 1]][i - 1];
        DFS(v);
    }
}
int LCA (int u, int v)
{
    if (h[u] != h[v])
    {
        if (h[u] < h[v])
            swap(u, v);
        for (int k = h[u] - h[v], i = 0; 1 << i <= k; ++i)
            if (k >> i & 1)
                u = up[u][i];
    }
    if (u == v)
        return u;
    for (int i = __lg(h[u]); i >= 0; --i)
        if (up[u][i] != up[v][i])
            u = up[u][i], v = up[v][i];
    return up[v][0];
}
//
struct Segment_Tree
{
    int node[maxN << 1];
    //
    void build (void)
    {
        for (int i = 0; i < N; ++i)
            node[i + N] = i;
        for (int id = N - 1; id > 0; --id)
            node[id] = LCA(node[id << 1], node[id << 1 | 1]);
    }
    int query (int l, int r)
    {
        int res = l;
        //
        for (l += N, r += N; l < r; l >>= 1, r >>= 1)
        {
            if (l & 1)
                res = LCA(res, node[l++]);
            if (r & 1)
                res = LCA(res, node[--r]);
        }
        return res + 1;
    }
} ST;
//
struct process
{
    void input (void)
    {
        int u, v;
        //
        cin >> N >> Q;
        for (int i = 1; i < N; ++i)
            cin >> u >> v,
            edge[--u].emplace_back(--v),
            edge[v].emplace_back(u);
    }
    void solve (void)
    {
        DFS(0);
        ST.build();
    }
    void output (void)
    {
        for (int u, v; Q--;)
            cin >> u >> v,
            cout << ST.query(--u, v) << '\n';
    }
    //
    process (void)
    {
        input(), solve(), output();
    }
};
//
signed main (void)
{
    ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    process();
}
