#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
const int N = 100100;
int n,q;
int deep[N],dad[N],size[N],top[N];
vector<int>vec[N];
inline int read()//优读
{
int x=0,f=1;char ch=getchar();
while(ch<‘0‘ || ch>‘9‘)
{if(ch==‘-‘) f=-1;ch=getchar();}
while(ch>=‘0‘ && ch<=‘9‘)
{x=x*10+ch-‘0‘;ch=getchar();}
return x*f;
}
void swap(int &a,int &b)
{//手写swap
int qwq=a;
a=b;
b=qwq;
}
void dfs1(int x)
{//寻找子节点个数以及深度,链头
size[x]=1;
deep[x]=deep[dad[x]]+1;
for(int i=0;i<vec[x].size();i++)
if(dad[x]!=vec[x][i])
{
dad[vec[x][i]]=x;
dfs1(vec[x][i]);
size[x]+=size[vec[x][i]];
}
}
void dfs2(int x)
{
int tops=0;
//如果该点没有链头,自己就是链头(蜜汁熟悉感2333)
if(!top[x])
top[x]=x;
//+3
for(int i=0;i<vec[x].size();i++)
//如果是当前点的子节点:
//寻找子节点中子节点最多的节点
//(找重链)
if(dad[x]!=vec[x][i] && size[vec[x][i]]>size[tops])
tops=vec[x][i];
if(tops)
{
top[tops]=top[x];
dfs2(tops);
}
for(int i=0;i<vec[x].size();i++)
//是子节点并且不在重链上
if(dad[x]!=vec[x][i] && vec[x][i]!=tops)
dfs2(vec[x][i]);
}
inline int lca(int x,int y)
{
while(top[x]!=top[y])//若不在一条链上
{
if(deep[top[x]]<deep[top[y]])
//将 x 的链头手动设置为比较靠下的那个点
swap(x,y);
//从链头往上跳
x=dad[top[x]];
}
//lca一定是比较靠上的那个
if(deep[x]>deep[y])
swap(x,y);
return x;
}
int main()
{
n=read(),q=read();
for(int i=1,u,v;i<n;i++)
{
u=read(),v=read();
vec[u].push_back(v),vec[v].push_back(u);
}
dfs1(1);
dfs2(1);
for(int i=1,a,b,c,d;i<=q;i++)
{
a=read(),b=read(),c=read(),d=read();
// printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
int S=lca(a,b),T=lca(c,d);
// printf("%d %d LCA=\n%d %d LCA=\n",a,b,S,c,d,T);
//寻找比较靠下的点
/*
错误×(大概是应该直接进行交换???)
if(deep[S]<deep[T])
if(lca(T,a)==T || lca(T,b)==T)
cout<<"Y"<<endl;
else if(deep[S]>deep[T])
if(lca(S,c)==S || lca(S,d)==S)
cout<<"Y"<<endl;
*/
if(deep[S]<deep[T])
{
swap(S,T);
swap(a,c);
swap(b,d);
}
//判断一下
if(lca(S,c)==S || lca(S,d)==S)
cout<<"Y"<<endl;
else
cout<<"N"<<endl;
}
return 0;
}