#include using namespace std; int head[100005], ver[200005], nex[200005], tot; int fa[100005][30], dep[100005]; inline void addedge(int u, int v) { ver[tot] = v; nex[tot] = head[u]; head[u] = tot++; } void dfs(int pre, int cur) { fa[cur][0] = pre; dep[cur] = dep[pre] + 1; for (int i = 1; i <= 25; i++) { fa[cur][i] = fa[fa[cur][i - 1]][i - 1]; } for (int i = head[cur]; i != -1; i = nex[i]) { if (!dep[ver[i]]) { dfs(cur, ver[i]); } } } int lca(int u, int v) { if (dep[u] > dep[v]) { swap(u, v); } for (int i = 25; i > -1; i--) { if (dep[fa[v][i]] >= dep[u]) { v = fa[v][i]; } } if (u == v) { return v; } for (int i = 25; i > -1; i--) { if (fa[u][i] != fa[v][i]) { u = fa[u][i]; v = fa[v][i]; } } return fa[u][0]; } int main() { int n, t, x, y, a, b, c, d; cin >> n >> t; memset(head, -1, sizeof(head)); for (int i = 1; i < n; i++) { cin >> x >> y; addedge(x, y); addedge(y, x); } dfs(0, 1); while (t--) { cin >> a >> b >> c >> d; int x = lca(a, b), y = lca(c, d); if (dep[x] > dep[y]) { swap(x, y); swap(a, c); swap(b, d); } cout << (lca(x, y) == x && (lca(a, y) == y || lca(b, y) == y) ? "Y" : "N") << endl; } return 0; }