#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5, max2 = 20;
int n, q, u, v, a, b, c, d, dep[maxn], f[maxn][max2];
vector <int> e[maxn];
void dfs(int x, int fa) {
for (int i = 0; i < e[x].size(); ++i) {
int to = e[x][i];
if (to == fa) {
continue;
}
dep[to] = dep[x] + 1;
f[to][0] = x;
dfs(to, x);
}
return ;
}
int lca(int x, int y) {
if (dep[x] > dep[y]) {
swap(x, y);
}
for (int i = 0; i < max2; ++i) {
if (((dep[y] - dep[x]) >> i) & 1) {
y = f[y][i];
}
if (dep[x] == dep[y]) {
break;
}
}
if (x == y) {
return x;
}
for (int i = max2 - 1; i >= 0; --i) {
if (f[x][i] == f[y][i]) {
continue;
}
x = f[x][i];
y = f[y][i];
}
return f[x][0];
}
bool judge(int x, int y, int k, int l, int L1, int L2) {
int dis_x_L1, dis_L1_l, dis_x_l, dis_k_L2, dis_L2_y, dis_k_y;
dis_x_L1 = abs(dep[x] - dep[L1]);
dis_L1_l = abs(dep[L1] + dep[l] - 2 * dep[L2]);
dis_x_l = abs(dep[x] + dep[l] - 2 * dep[L2]);
dis_k_L2 = abs(dep[k] - dep[L2]);
dis_L2_y = abs(dep[L2] + dep[y] - 2 * dep[L1]);
dis_k_y = abs(dep[k] + dep[y] - 2 * dep[L1]);
if (x == y) {
int dis_k_x = abs(dep[k] - dep[x]);
int dis_x_l = abs(dep[x] + dep[l] - 2 * dep[L2]);
int dis_k_l = abs(dep[k] + dep[l] - 2 * dep[L2]);
if (dis_k_x + dis_x_l == dis_k_l) {
return true;
}
return false;
}
if (k == l) {
int dis_x_k = abs(dep[x] - dep[k]);
int dis_k_y = abs(dep[k] + dep[y] - 2 * dep[L1]);
int dis_x_y = abs(dep[x] + dep[y] - 2 * dep[L1]);
if (dis_x_k + dis_k_y == dis_x_y) {
return true;
}
return false;
}
if (dis_x_L1 + dis_L1_l == dis_x_l) {
return true;
}
if (dis_k_L2 + dis_L2_y == dis_k_y) {
return true;
}
return false;
}
int main(void) {
scanf("%d %d", &n, &q);
for (int i = 1; i < n; ++i) {
scanf("%d %d", &u, &v);
e[u].push_back(v);
e[v].push_back(u);
}
f[1][0] = -1;
dfs(1, 0);
for (int j = 1; j < max2; ++j) {
for (int i = 1; i <= n; ++i) {
f[i][j] = f[f[i][j - 1]][j - 1];
}
}
while (q--) {
scanf("%d %d %d %d", &a, &b, &c, &d);
int lca1, lca2;
lca1 = lca(a, b);
lca2 = lca(c, d);
if (judge(a, b, c, d, lca1, lca2)) {
printf("Y\n");
}
else {
printf("N\n");
}
}
return 0;
}