#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
struct node{
int v,nxt;
}e[2*maxn];int k,head[maxn];
void add(int u,int v){e[++k].v=v;e[k].nxt=head[u];head[u]=k;}
int n,q;
bool vis[maxn];
int lg[maxn],depth[maxn],f[maxn][20];
void dfs(int u)
{
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(!vis[v])
{
depth[v]=depth[u]+1;
f[v][0]=u;
for(int j=1;j<=lg[depth[v]];j++)
f[v][j]=f[f[v][j-1]][j-1];
dfs(v);
}
}
}
int lca(int a,int b)
{
if(depth[a]<depth[b])swap(a,b);
while(depth[a]<depth[b])a=f[a][lg[depth[a]-depth[b]]-1];
if(a==b)return a;
for(int i=lg[depth[a]]-1;i>=0;i--)
{
if(f[a][i]!=f[b][i])
{
a=f[a][i];
b=f[b][i];
}
}
return f[a][0];
}
int dist(int a,int b)
{
int f=lca(a,b);
return abs(depth[f]-depth[a])+abs(depth[f]-depth[b]);
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n-1;i++)
{
int a,b;cin>>a>>b;
add(a,b);add(b,a);
}
for(int i=1;i<=n;i++)lg[i]=lg[i-1]+(1<<lg[i-1]==i);
depth[1]=1;
dfs(1);
for(int i=1;i<=q;i++)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int x=lca(a,b);
int y=lca(c,d);
if(dist(c,x)+dist(x,d)==dist(c,d)||dist(a,y)+dist(y,b)==dist(a,b))cout<<'Y'<<'\n';
else cout<<'N'<<'\n';
}
}