#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define G *++ptr
const int N=50007;
char buf[10000007],*ptr=buf-1;
int _(){
int x=0,c=G;
while(c<48)c=G;
while(c>47)x=x*10+c-48,c=G;
return x;
}
int n,m,q;
bool as[N];
int f[N],xm[N],ym[N],B,bs[N],bp=0,*o1[N],o2[N],op=0;
void undo(){
while(op)--op,*o1[op]=o2[op];
}
inline void set(int*x,int y){
o1[op]=x;
o2[op++]=*x;
*x=y;
}
void init(){
memset(f,-1,sizeof(int)*(n+2));
memset(xm,-1,sizeof(int)*(n+2));
memset(ym,-1,sizeof(int)*(n+2));
}
inline int gf(int x){
while(f[x]>0)x=f[x];
return x;
}
struct Q{
int u,v,x,y,id;
void init(int i){
u=_();v=_();x=_();y=_();
id=i;
}
void cal(){
int a=gf(u),b=gf(v);
if(a==b&&xm[a]==x&&ym[b]==y)as[id]=1;
}
}qs[N];
bool qcmpx(const Q&a,const Q&b){return a.x<b.x;}
bool qcmpy(const Q&a,const Q&b){return a.y<b.y;}
int max(int a,int b){return a>b?a:b;}
struct edge{
int u,v,x,y;
void init(){
u=_();v=_();x=_();y=_();
}
void cal(){
int a=gf(u),b=gf(v);
if(a!=b){
if(f[a]<f[b])std::swap(a,b);
if(f[a]==f[b])--f[b];
f[a]=b;
}
int xx=max(xm[a],x),yy=max(ym[a],y);
if(xx>xm[b])xm[b]=xx;
if(yy>ym[b])ym[b]=yy;
}
void cal_(){
int a=gf(u),b=gf(v);
if(a!=b){
if(f[a]<f[b])std::swap(a,b);
if(f[a]==f[b])set(f+b,f[b]-1);
set(f+a,b);
}
int xx=max(xm[a],x),yy=max(ym[a],y);
if(xx>xm[b])set(xm+b,xx);
if(yy>ym[b])set(ym+b,yy);
}
}e[N*2];
bool ecmpx(const edge&a,const edge&b){return a.x<b.x;}
bool ecmpy(const edge&a,const edge&b){return a.y<b.y;}
void msort(edge*l,edge*m,edge*r){
static edge ee[N*2];
std::sort(m,r,ecmpy);
if(l==m||m==r)return;
edge*p1=l,*p2=m,*p3=ee;
while(p1!=m&&p2!=r)*p3++=p1->y<p2->y?*p1++:*p2++;
while(p1!=m)*p3++=*p1++;
while(p2!=r)*p3++=*p2++;
memcpy(l,ee,(p3-ee)*sizeof(edge));
}
int main(){
fread(buf,1,sizeof(buf),stdin)[buf]=0;
n=_();m=_();
B=n/sqrt(m+1)*2+1;
for(int i=0;i<m;++i)e[i].init();
q=_();
for(int i=0;i<q;++i)qs[i].init(i);
std::sort(qs,qs+q,qcmpx);
std::sort(e,e+m,ecmpx);
for(int i=0,j=0;i<m;i=j){
for(;j<m&&e[i].x==e[j].x;++j);
if(j-bs[bp]>B)bs[++bp]=i;
}
e[bs[++bp]=m].x=0x3f3f3f3f;
for(int b=0,l=0,r=0,S=0;b<bp;++b){
int L=bs[b],R=bs[b+1];
for(l=r;r<q&&qs[r].x<e[R].x;++r);
std::sort(qs+l,qs+r,qcmpy);
if(e[L].x==e[R-1].x){
msort(e,e+S,e+R);S=R;
init();
for(int ep=0,p=l;p<r;++p){
Q&w=qs[p];
for(;ep<R&&e[ep].y<=w.y;++ep)e[ep].cal();
w.cal();
}
}else{
msort(e,e+S,e+L);S=L;
init();
for(int ep=0,p=l;p<r;++p){
Q&w=qs[p];
for(;ep<L&&e[ep].y<=w.y;++ep)e[ep].cal();
for(int ep=L;ep<R;++ep)if(e[ep].x<=w.x&&e[ep].y<=w.y)e[ep].cal_();
w.cal();
undo();
}
}
}
for(int i=0;i<q;++i)puts(as[i]?"Yes":"No");
return 0;
}