#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
struct node{
int next,to;
}t[2*N];
int head[N],idx=0;
int f[N][30],dep[N];
int n,q,u,v;
int a,b,c,d;
int S,T;
int read(){
int w=0;bool f=0;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=1;ch=getchar();}
while(isdigit(ch)){w=(w<<1)+(w<<3)+ch-'0';ch=getchar();}
w=f?-w:w;
return w;
}
void add(int u,int v){
t[++idx].to=v;
t[idx].next=head[u];
head[u]=idx;
}
void dfs(int now,int fa){
dep[now]=dep[fa]+1;
f[now][0]=fa;
for(int i=head[now];i;i=t[i].next){
int y=t[i].to;
if(y==fa) continue;
dfs(y,now);
}
}
void prework(){
for(int i=1;i<=n;i++){
for(int j=1;j<=30;j++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=30;i>=0;i--){
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
}
if(x==y) return x;
for(int i=30;i>=0;i--){
if(f[x][i]==f[y][i]) continue;
else{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
void check(){
if(dep[S]<dep[T]){
swap(a,c);swap(b,d);swap(S,T);
}
if(lca(S,c)==S||lca(S,d)==S) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
signed main(){
n=read();q=read();
for(int i=1;i<n;i++){
u=read();v=read();
add(u,v);add(v,u);
}
dfs(1,0);
prework();
for(int i=1;i<=q;i++){
a=read();b=read();c=read();d=read();
S=lca(a,b);
T=lca(c,d);
check();
}
return 0;
}