#include<bits/stdc++.h>
using namespace std;
long long read()
{
long long x=0,t=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')t=-t;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*t;
}
vector<int> V[500005];
vector<pair<int,int> > G[500005];
vector<int> que[500005];
tuple<int,int,int> ans[500005];
int fa[500005],vis[500005],dep[500005];
int getfa(int x){if(fa[x]==x)return x;return fa[x]=getfa(fa[x]);}
void dfs(int x,int fat)
{
vis[x]=1;dep[x]=dep[fat]+1;fa[x]=x;
for(int v:V[x])if(!vis[v])dfs(v,x),fa[v]=x;
for(auto g:G[x])if(vis[g.first]==1)que[g.second].push_back(g.first);else if(vis[g.first]==2)que[g.second].push_back(getfa(g.first));
vis[x]=2;
}
int depth(int x,int i){return abs(dep[get<0>(ans[i])]-dep[x])+abs(dep[get<1>(ans[i])]-dep[x])+abs(dep[get<2>(ans[i])]-dep[x]);}
int main()
{
int n=read(),m=read();
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1,x,y;i<n;i++)V[x=read()].push_back(y=read()),V[y].push_back(x);
for(int i=1,x,y,z;i<=m;i++)
ans[i]={x=read(),y=read(),z=read()},
G[x].push_back({y,i}),G[y].push_back({x,i}),G[x].push_back({z,i}),G[z].push_back({x,i}),G[z].push_back({y,i}),G[y].push_back({z,i});
dfs(1,0);
for(int i=1;i<=m;i++)
{
int Min=1,Mini;
for(auto it=que[i].begin();it!=que[i].end();it++)
if(depth(*it,i)<depth(Min,i))Min=*it;
printf("%d %d\n",Min,abs(dep[get<0>(ans[i])]-dep[Min])+abs(dep[get<1>(ans[i])]-dep[Min])+abs(dep[get<2>(ans[i])]-dep[Min]));
}
}