#include <fstream>
#include <iostream>
#include <vector>
#define nmax 100001
using namespace std;
ifstream f("drumarb.in");
ofstream g("drumarb.out");
vector <int> v[nmax];
int n,r[18][2*nmax],e[2*nmax],k=1,viz[nmax],lg[2*nmax],p[nmax],l[nmax];
void euler(int nod, int lev)
{
int i;
viz[nod]=1;
l[nod]=lev;
p[nod]=k;
e[k++]=nod;
for(i=0;i<v[nod].size();i++)
{
if(!viz[v[nod][i]])
{
euler(v[nod][i],lev+1);
e[k++]=nod;
}
}
}
void rmq()
{
int i,j;
lg[1]=0;
for(i=2;i<k;i++)
lg[i]=lg[i/2]+1;
for(i=1;i<k;i++)
r[0][i]=i;
for(i=1;(1<<i)<k;i++)
{
for(j=1;j<k;j++)
{
r[i][j]=r[i-1][j];
if(j+(1<<(i-1))<k && l[e[r[i-1][j+(1<<(i-1))]]]<l[e[r[i][j]]])
r[i][j]=r[i-1][j+(1<<(i-1))];
}
}
}
int lca(int x, int y)
{
int a,b,aux,dif,o,sol;
a=p[x]; b=p[y];
if(a>b) {aux=a; a=b; b=aux;}
dif=b-a+1;
sol=e[r[lg[dif]][a]];
o=dif-(1<<lg[dif]);
if( o && l[e[r[lg[dif]][a+o]]]<l[sol])
sol=e[r[lg[dif]][a+o]];
return sol;
}
int dist(int x,int y)
{
return l[x]+l[y]-2*l[lca(x,y)];
}
int main()
{
f>>n;
int i,x,y,m;
f>>m;
for(i=1;i<n;i++)
{
f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
euler(1,1);
rmq();
for(i=0;i<m;i++)
{
int ax,ay,bx,by;
f>>ax>>ay>>bx>>by;
int lxx=lca(ax,bx),lxy=lca(ax,by),lyx=lca(ay,bx),lyy=lca(ay,by),laa=lca(ax,ay),lbb=lca(bx,by);
//if (lca(laa,lbb)==laa)
if (laa==lbb)
{g<<max(dist(lxx,lyy),dist(lxy,lyx))+1<<'\n';continue;}
if (lca(ax,lbb)==lbb || lca(ay,lbb)==lbb)
if (lca(lbb,ax)==ax || lca(lbb,ay)==ay)
{g<<min(dist(ay,lbb),dist(ax,lbb))<<'\n';continue;}
if (lca(bx,laa)==laa || lca(by,laa)==laa)
if ((lca(laa,bx)==bx || lca(laa,by)==by))
{g<<min(dist(by,laa),dist(bx,laa))<<'\n';continue;}
if ((lca(ax,lbb)==ax) || (lca(ay,lbb)==ay) || (lca(bx,laa)==bx) || (lca(by,laa)==by))
{g<<"0\n";continue;}
g<<max(dist(lxy,lyx),dist(lyy,lyx))<<'\n';
ax=0;
}
}