#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-‘0‘;
return x*f;
}
const int maxn=50010;
const int maxm=100010;
int n,m,q;
struct Query {
int u,v,a,b,tp;
bool operator < (const Query& ths) const {return b<ths.b||(b==ths.b&&tp<ths.tp);}
}E[maxm],Q[maxn],T[maxm*2];
int pa[maxn],rk[maxn],mxa[maxn],mxb[maxn];
int findset(int x) {return pa[x]==x?x:findset(pa[x]);}
struct Data {int x,y,rk,mxa,mxb;}S[maxm];
int top,ans[maxn];
void merge(int u,int v,int a,int b) {
int x=findset(u),y=findset(v);
if(rk[x]<rk[y]) swap(x,y);
S[++top]=(Data){x,y,rk[x],mxa[x],mxb[x]};
pa[y]=x;mxa[x]=max(mxa[x],mxa[y]);mxb[x]=max(mxb[x],mxb[y]);
mxa[x]=max(mxa[x],a);mxb[x]=max(mxb[x],b);
if(rk[x]==rk[y]) rk[x]++;
}
void del() {
int x=S[top].x,y=S[top].y;
pa[y]=y;rk[x]=S[top].rk;mxa[x]=S[top].mxa;mxb[x]=S[top].mxb;
top--;
}
bool cmp(Query a,Query b) {return a.a<b.a;}
int main() {
n=read();m=read();
rep(i,1,m) E[i].tp=0,E[i].u=read(),E[i].v=read(),E[i].a=read(),E[i].b=read();
q=read();rep(i,1,q) Q[i].tp=i,Q[i].u=read(),Q[i].v=read(),Q[i].a=read(),Q[i].b=read();
int SIZE=sqrt(m*2),cnt=0;
sort(E+1,E+m+1,cmp);
sort(Q+1,Q+q+1,cmp);
rep(i,1,m) {
if((++cnt==SIZE)||i==m) {
int N=0;
rep(j,1,i-cnt) T[++N]=E[j];
rep(j,1,q) if(Q[j].a>=E[i-cnt+1].a&&(i==m||Q[j].a<E[i+1].a)) T[++N]=Q[j];
if(i-cnt!=N) {
rep(j,1,n) pa[j]=j,rk[j]=0,mxa[j]=mxb[j]=-1;
sort(T+1,T+N+1);top=0;
rep(j,1,N) {
if(T[j].tp) {
rep(k,i-cnt+1,i+1) {
if(E[k].a>T[j].a||k>i) {
int pa1=findset(T[j].u),pa2=findset(T[j].v);
if(pa1==pa2&&mxa[pa1]==T[j].a&&mxb[pa1]==T[j].b) ans[T[j].tp]=1;
rep(z,i-cnt+1,k-1) if(E[z].b<=T[j].b) del();
break;
}
if(E[k].b<=T[j].b) merge(E[k].u,E[k].v,E[k].a,E[k].b);
}
}
else merge(T[j].u,T[j].v,T[j].a,T[j].b);
}
}
cnt=0;
}
}
rep(i,1,q) puts(ans[i]?"Yes":"No");
return 0;
}