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<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
using namespace std;
int cnt,h[200005],sta[200005],top,dfn[1000005],low[1000005],sign,occ,be[200005],tot,m,n,las[200005],vis[1000005],mx,b[2000005],tot1;
vector<int>vec[1000005];
struct l1{
	int to,next,id;
}p[1000005];
struct l2{
	int x,y,t,c;
}s[1000005];
void add(int x,int y,int id){
	cnt++;
	p[cnt].to=y;
	p[cnt].next=h[x];
	h[x]=cnt;
	p[cnt].id=id;
}
void add(int x,int y){
//	cout<<x<<' '<<y<<endl;
//	cout<<(y^1)<<' '<<(x^1)<<endl;
	vec[x].push_back(y);
	vec[y^1].push_back(x^1);
}
void tarjan(int x){
	sta[++top]=x;
	dfn[x]=low[x]=++sign;
	for(int i=0;i<vec[x].size();i++){
		int y=vec[x][i];
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(!be[y]){
			low[x]=min(low[x],dfn[y]);
		}
	}
	if(dfn[x]==low[x]){
		occ++;
		while(sta[top+1]!=x){
			be[sta[top]]=occ;
			top--;
		}
	}
}
int solve(int mid,int tp){
	tot=m;
//	cout<<mid<<' '<<tp<<' '<<"qwq"<<endl;
	for(int i=1;i<=m;i++){
		if(s[i].t>mid) vec[i<<1].push_back((i<<1)^1);
	}
	for(int i=1;i<=n;i++){
		int ls=0;
		for(int t=h[i];t;t=p[t].next){
			int id=p[t].id;
			int nw=++tot;
			add(id<<1,nw<<1);
			if(ls) add(ls<<1,(id<<1)^1),add(ls<<1,nw<<1);
			ls=nw;
			int now=++tot;
			add((id<<1)^1,now<<1);
			if(las[s[id].c]){
				add(las[s[id].c]<<1,(id<<1));add(las[s[id].c]<<1,now<<1);
			}
			las[s[id].c]=now;
		}
		for(int t=h[i];t;t=p[t].next){
			int id=p[t].id;
			las[s[id].c]=0;
		}
	}
	memset(be,0,sizeof(be));sign=occ=0;
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
//	cout<<tot<<' '<<((tot<<1)^1)<<' '<<"qwq"<<endl;
	for(int i=1;i<=((tot<<1)^1);i++){
//		cout<<dfn[i]<<' '<<i<<endl;
		if(!dfn[i]) tarjan(i);
	}
	for(int i=1;i<=((tot<<1)^1);i++){
		vec[i].clear();
	}
	if(!tp){
		for(int i=1;i<=m;i++){
//			cout<<i<<' '<<be[i<<1]<<' '<<be[(i<<1)^1]<<endl;
			if(be[i<<1]==be[(i<<1)^1]) return 0;
		}
		return 1;
	}
	else{
		memset(vis,0,sizeof(vis));tot=0;
		for(int i=1;i<=m;i++){
			if(be[i<<1]==be[(i<<1)^1]){
				printf("No\n");
				exit(0);
			}
			else if(be[i<<1]<be[(i<<1)^1]){
				vis[i]=1;tot++;
			}
		}
		printf("Yes\n");
		printf("%d %d\n",mid,tot);
		for(int i=1;i<=m;i++){
			if(vis[i]) printf("%d ",i);
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d%d",&s[i].x,&s[i].y,&s[i].c,&s[i].t);
		b[++tot1]=s[i].c;
		add(s[i].x,s[i].y,i);add(s[i].y,s[i].x,i);mx=max(mx,s[i].t);
	}
	sort(b+1,b+tot1+1);
	tot1=unique(b+1,b+tot1+1)-b-1;
	for(int i=1;i<=m;i++){
		s[i].c=lower_bound(b+1,b+tot1+1,s[i].c)-b;
	}
	int l=0,r=mx,ans=mx;
	while(l<=r){
		int mid=l+r>>1;
		if(solve(mid,0)) ans=mid,r=mid-1;
		else l=mid+1;
	}
	solve(ans,1);
}