3 5
2 1 608591421 720962564
3 2 608591421 641991574
3 2 718110706 353409763
2 3 482786015 858341723
3 2 825397574 357507279
 2 1
2 1 317425595 636156322
 50000 1
20845 28516 904146168 997637433

Yes
641991574 1
2 
 Yes
0 0

 Yes
0 0


#include<bits/stdc++.h>
#define re register
using namespace std;
inline int read(){
	re int t=0;re char v=getchar();
	while(v<'0')v=getchar();
	while(v>='0')t=(t<<3)+(t<<1)+v-48,v=getchar();
	return t;
}
int n,head[400002],cnt,lst[50002],w[400002],dfn[400002],low[400002],stk[400002],bl[400002],tim,tp,blk,tot,head1[400002],m,cnt1,a[400002],b[400002],c[400002],d[400002],A[400002],B[400002];
char ist[400002];
struct edge{int to,next;}e[2000002];
struct node{int x,y,id;};
vector<node>v[50002];
inline void add(re int x,re int y){e[++cnt]=(edge){y,head[x]},head[x]=cnt;}
inline void tj(re int x){
	dfn[x]=low[x]=++tim,stk[++tp]=x,ist[x]=1;
	for(re int i=head[x];i;i=e[i].next)
		if(!dfn[e[i].to])tj(e[i].to),low[x]=min(low[x],low[e[i].to]);
		else if(ist[e[i].to])low[x]=min(low[x],dfn[e[i].to]);
	if(dfn[x]==low[x]){
		++blk;
		do{
			bl[stk[tp]]=blk;
			ist[stk[tp--]]=0;
		}while(stk[tp+1]^x);
	}
}
inline bool check(){
	memset(dfn,0,sizeof(dfn)),tim=0;
	for(re int i=1;i<=tot;++i)if(!dfn[i])tj(i);
	for(re int i=1;i<=m;++i)if(bl[i]==bl[i+m])return 0;
	return 1;
}
inline bool check(re int x){
	for(re int i=1;i<=tot;++i)head[i]=head1[i];cnt=cnt1;
	for(re int i=1;i<=m;++i)if(d[i]>x)add(i,i+m);
	return check();
}
signed main(){
//	freopen("a.in","r",stdin);
	n=read(),m=tot=read(),tot<<=1;
	for(re int i=1;i<=m;++i)a[i]=read(),b[i]=read(),c[i]=A[i]=read(),d[i]=B[i]=read();
	sort(A+1,A+m+1),sort(B+1,B+m+1);
	for(re int i=1;i<=m;++i)c[i]=lower_bound(A+1,A+m+1,c[i])-A,d[i]=lower_bound(B+1,B+m+1,d[i])-B;
	for(re int i=1;i<=m;++i)v[c[i]].push_back((node){a[i],b[i],i});
	for(re int i=1;i<=m;++i){
		++tot;
		if(lst[a[i]])add(i,lst[a[i]]),add(tot,lst[a[i]]);
		add(tot,i+m),lst[a[i]]=tot;
		++tot;
		if(lst[b[i]])add(i,lst[b[i]]),add(tot,lst[b[i]]);
		add(tot,i+m),lst[b[i]]=tot;
	}
	memset(lst,0,sizeof(lst));
	for(re int i=m;i;--i){
		++tot;
		if(lst[a[i]])add(i,lst[a[i]]),add(tot,lst[a[i]]);
		add(tot,i+m),lst[a[i]]=tot;
		++tot;
		if(lst[b[i]])add(i,lst[b[i]]),add(tot,lst[b[i]]);
		add(tot,i+m),lst[b[i]]=tot;
	}
	memset(lst,0,sizeof(lst));
	for(re int j=1;j<=m;++j){
		for(re int k=0;k<v[j].size();++k){
			re int i=v[j][k].id;
			++tot;
			if(lst[a[i]])add(i+m,lst[a[i]]),add(tot,lst[a[i]]);
			add(tot,i),lst[a[i]]=tot;
			++tot;
			if(lst[b[i]])add(i+m,lst[b[i]]),add(tot,lst[b[i]]);
			add(tot,i),lst[b[i]]=tot;
		}
		for(re int k=0;k<v[j].size();++k){
			re int i=v[j][k].id;
			lst[a[i]]=lst[b[i]]=0;
		}
		for(re int k=v[j].size()-1;~k;--k){
			re int i=v[j][k].id;
			++tot;
			if(lst[a[i]])add(i+m,lst[a[i]]),add(tot,lst[a[i]]);
			add(tot,i),lst[a[i]]=tot;
			++tot;
			if(lst[b[i]])add(i+m,lst[b[i]]),add(tot,lst[b[i]]);
			add(tot,i),lst[b[i]]=tot;
		}
		for(re int k=0;k<v[j].size();++k){
			re int i=v[j][k].id;
			lst[a[i]]=lst[b[i]]=0;
		}
	}
	cnt1=cnt;
	for(re int i=1;i<=tot;++i)head1[i]=head[i];
	re int l=1,r=m,ans=0;
	while(l<=r){
		re int mid=l+r>>1;
		if(check(mid))ans=mid,r=mid-1;
		else l=mid+1;
	}
	if(ans){
		puts("Yes");
		check(ans);
		for(re int i=1;i<=m;++i)if(bl[i]<bl[i+m])printf("%d %d\n",a[i],b[i]);
	}
	else puts("No");
}