int N, Q;
vector<int> links[200010];
int depth[200010];
vector<pii> childs[200010]; // {mxDepth, nodeIdx}
vector<pii> childs2[200010]; // {mxDiam, nodeIdx}
int diam[200010], upDepth[200010], upDiam[200010];
void dfs1(int cur, int par){
vector<pii> ret;
ret.push_back({0, cur});
for(auto nxt: links[cur]){
if(nxt == par) continue;
depth[nxt] = depth[cur] + 1;
dfs1(nxt, cur);
diam[cur] = max(diam[cur], diam[nxt]);
ret.push_back({childs[nxt][0].first + 1, nxt});
sort(all(ret), greater<pii>());
if((int)ret.size() > 3) ret.pop_back();
childs2[cur].push_back({diam[nxt], nxt});
sort(all(childs2[cur]), greater<pii>());
if((int)childs2[cur].size() > 2) childs2[cur].pop_back();
}
childs[cur] = ret;
if((int)ret.size() >= 2) diam[cur] = max(diam[cur], ret[0].first + ret[1].first);
if((int)ret.size() >= 1) diam[cur] = max(diam[cur], ret[0].first);
}
void dfs2(int cur, int par, int mxUp){
for(auto nxt: links[cur]){
if(nxt == par) continue;
vector<int> candidates;
candidates.push_back(mxUp);
for(auto [d, idx]: childs[cur]) if(idx != nxt) candidates.push_back(d);
sort(all(candidates), greater<int>());
if((int)candidates.size() >= 2) upDiam[nxt] = max(upDiam[nxt], candidates[0] + candidates[1]);
if((int)candidates.size() >= 1) upDiam[nxt] = max(upDiam[nxt], candidates[0]);
for(auto [d, idx]: childs2[cur]) if(idx != nxt) upDiam[nxt] = max(upDiam[nxt], d);
upDiam[nxt] = max(upDiam[nxt], upDiam[cur]);
dfs2(nxt, cur, candidates[0] + 1);
}
}
void solve(){
cin >> N >> Q;
rep(i, 0, N-1){
int u, v; cin >> u >> v;
links[u].push_back(v);
links[v].push_back(u);
}
dfs1(1, -1);
dfs2(1, -1, 0);
// rep(i, 1, N+1) cout << diam[i] << " "; cout << "\n";
// rep(i, 1, N+1) cout << upDiam[i] << " "; cout << "\n";
while(Q--){
int u, v; cin >> u >> v;
if(depth[u] < depth[v]) swap(u, v);
cout << diam[u] + upDiam[u] + 1 << "\n";
}
}