见洛谷一二篇题解、、、
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=500000+2;
int n,m,s;
int k=0;
int head[maxn],d[maxn],p[maxn][21];
struct node{
int v;
int next;
}e[maxn*2];
void add(int u,int v) {
e[k].v=v;
e[k].next=head[u];
head[u]=k++;
}
void dfs(int u,int fa) {
d[u]=d[fa]+1;
p[u][0]=fa;
for(int i=1;(1<<i)<=d[u];i++)
p[u][i]=p[p[u][i-1]][i-1];
for(int i=head[u];i!=-1;i=e[i].next) {
int v=e[i].v;
if(v!=fa)
dfs(v,u);
}
}
int lca(int a,int b) {
if(d[a]>d[b])
swap(a,b);
for(int i=20;i>=0;i--)
if(d[a]<=d[p[b][i]])
b=p[b][i];
if(a==b)
return a;
for(int i=20;i>=0;i--) {
if(p[a][i]==p[b][i])
continue;
else {
a=p[a][i];
b=p[b][i];
}
}
return p[a][0];
}
int di(int x,int y)
{
int fa=lca(x,y);
return abs(d[x]-d[fa])+abs(d[y]-d[fa]);
}
int main() {
memset(head,-1,sizeof(head));
int a,b,c;
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++) {
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(1,0);
for(int i=1;i<=m;i++) {
scanf("%d%d%d",&x,&y,&z);
int zx=lca(x,z);
int zy=lca(z,y);
int xy=lca(x,y);
int ans;
if(zx==zy) ans=xy;
if(zy==xy) ans=zx;
if(zx==xy) ans=zy;
int dis=d[x]+d[y]+d[z]-d[zx]-d[zy]-d[xy];
printf("%d %d\n",ans,dis) ;
}
return 0;
}