#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 1;
const int maxm = 1e6 + 1;
const int maxd = 20;
struct edge {
int from, to, next;
};
int cnt;
int head[maxn];
edge e[maxm];
void addedge(int u, int v) {
e[++cnt].to = v;
e[cnt].from = u;
e[cnt].next = head[u];
head[u] = cnt;
}
int n, q;
int a, b, c, d;
int fa[maxn][maxd];
int dep[maxn];
void get_dep(int u, int depth) {
dep[u] = depth;
for (int i = head[u]; i; i = e[i].next) {
get_dep(e[i].to, depth + 1);
}
}
void get_fa(int cur, int fat) {
fa[cur][0] = fat;
for (int i = 1; i <= log2(dep[cur]) + 1; i++) {
fa[cur][i] = fa[fa[cur][i - 1]][i - 1];
}
for (int i = head[cur]; i; i = e[i].next) {
get_fa(e[i].to, cur);
}
}
int lca(int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
while (dep[u] > dep[v]) {
u = fa[u][(int) log2(dep[u] - dep[v])];
}
if (u == v) return u;
for (int i = log2(dep[u]); i >= 0; i--) {
if (fa[u][i] != fa[v][i]) {
u = fa[u][i];
v = fa[v][i];
}
}
return fa[u][0];
}
int main() {
cin >> n >> q;
int u, v;
for (int i = 1; i <= n - 1; i++) {
cin >> u >> v;
addedge(u, v);
}
get_dep(1, 0);
get_fa(1, 0);
for (int i = 1; i <= q; i++) {
cin >> a >> b >> c >> d;
int abr = lca(a, b);
int cdr = lca(c, d);
bool flag = false;
if (abr == cdr) flag = true;
else {
if (dep[abr] > dep[cdr]) {
swap(abr, cdr);
swap(a, c);
swap(b, d);
}
flag = (lca(a, cdr) == cdr && lca(cdr, b) == cdr);
}
if (flag) {
cout << "Y" << endl;
} else {
cout << "N" << endl;
}
}
return 0;
}