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>

using namespace std;

#define int long long

const int maxn = 2e5 + 20;

vector<int> q, ad[maxn], rad[maxn], deg[maxn], DEG[maxn];
int co = 0, last[maxn], n, m, comp[maxn];
stack<int> stk;
bool vis[maxn], ds[maxn];

struct pack
{
	int u, v, c, t, ind;
}e_c[maxn], e[maxn];

int nt(int x)
{
	return (x < 2*m ? x + 2*m : x - 2*m);
}

bool comp_t(pack a, pack b)
{
	return a.t < b.t;
}

bool comp_c(pack a, pack b)
{
	return a.c < b.c;
}

void clause(int x, int y)
{
//	for(int i = 0; i < 400000; i++)	
//		q.push_back(2);
	ad[nt(x)].push_back(y);
	ad[nt(y)].push_back(x);
	rad[x].push_back(nt(y));
	rad[y].push_back(nt(x));
}

void dfs1(int root)
{
	vis[root] = true;
	for(int x:ad[root])
		if (!vis[x])
			dfs1(x);
	stk.push(root);
}

void dfs2(int root, int c)
{
	vis[root] = true;
	for(int x:rad[root])
		if (!vis[x])
			dfs2(x, c);
	comp[root] = c;
}

void just_one(int x)
{
	int sz = DEG[x].size();
//	cout << x << " " << sz << endl;
	for(int i = 0; i < sz; i++)
	{
//		cout << " " << i << " " << DEG[x][i] << endl;
		int y = DEG[x][i];
		clause(nt(y), y + m);
		if (i) 			 clause(nt(DEG[x][i - 1] + m), y + m);
		if (i != sz - 1) clause(nt(y + m), nt(DEG[x][i + 1]));
	}
}

inline bool ok(int xx)
{
//	for(int i = 0; i < m; i++)
//		e_c[i] = e[i];
//	xx = m - xx;
//	sort(e_c, e_c + m, comp_c);

//	for(int i = 0; i < m; i++)
//	    cout << e_c[i].u << " "<< e_c[i].v << endl;

//	for(int i = 0; i < 4*m; i++) DEG[i].clear(), ad[i].clear(), rad[i].clear();	

//	cout << endl << endl << endl << endl << endl;

//	cout << "#" << xx << endl;
//	for(int i = 0; i < 4*m; i++)
//		cout << " " << i << " $ " << ad[i].size() << " " << rad[i].size() << endl;
//	fill(vis, vis + maxn, false);
//	memset(vis, false, sizeof vis);

	for(int i = 0; i < m; i++)
		if (e[xx].t <= e_c[i].t)	
			clause(nt(i), nt(i));

	fill(vis , vis + 4*m, false);
	
	for(int i = 0; i < 4*m; i++)
		if (!vis[i])
			dfs1(i);
	int c = 0;
//	fill(vis, vis + maxn, false);
	fill(vis , vis + 4*m, false);
//	memset(vis, false, sizeof vis);
	while (stk.size())
	{
		int x = stk.top(); stk.pop();
		if (vis[x]) continue;
//		cout << x << " ! " << c << endl;
		dfs2(x, c++);
	}
	
//	for(int i = 0; i < 4*m; i++)
//		cout << " " << i << " $ " << comp[i] << endl;
	
	for(int i = 0; i < m; i++)
		if (e[xx].t <= e_c[i].t)	
			ad[i].pop_back(),
			ad[i].pop_back(),
			rad[nt(i)].pop_back(),
			rad[nt(i)].pop_back();
	
	for(int i = 0; i < 2*m; i++)
		if (comp[i] == comp[nt(i)])
			return false;
	return true;
}

 main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n >> m;
/*	if (n == 1000)
	{
		cout << "hey" << endl;
		return 0;
	}
*/	for(int i = 0; i < m; i++)
	{
		int u, v, c, t;
		cin >> u >> v >> c >> t;
		u--, v--;
		e[i].u = u, e[i].v = v, e[i].c = c, e[i].t = t, e[i].ind = i;
	}
//	for(int i = 0; i < 10101; i++)
//		sort(e, e + m, comp_c),
//		sort(e, e + m, comp_t);
//	sort(e, e + m, comp_c);
	sort(e, e + m, comp_t);
//	sort(e, e + m, comp_c);
//	sort(e, e + m, comp_t);
	for(int i = 0; i < m; i++)
		e_c[i] = e[i];
	sort(e_c, e_c + m, comp_c);
	
	fill(last, last + n, -1);
/*	if (n == 1000)
	{
		cout << "hey" << endl;
		return 0;
	}
*/	for(int i = 0; i < m; i++)
	{
		int u = e_c[i].u, v = e_c[i].v, c = e_c[i].c;
		
		DEG[u].push_back(i);
		DEG[v].push_back(i);
		
		if (c != last[u]) deg[u].clear();
		deg[u].push_back(i);
		if (c != last[v]) deg[v].clear();
		
		last[u] = last[v] = c;
		
//		cout << i << ": "  << c << " " << u << " " << v << endl;
		
		deg[v].push_back(i);
		
		if (deg[u].size() > 2 || deg[v].size() > 2) return cout << "No" << endl, 0;
		
		if (deg[u].size() == 2)
//			cout << u << "$" << endl, 
			clause(deg[u][0], deg[u][1]);	
		if (deg[v].size() == 2)
//			cout << v << "$" << endl, 
			clause(deg[v][0], deg[v][1]);	
	} 
/*	if (n == 1000)
	{
		cout << "hey" << endl;
		return 0;
	}
*/	for(int i = 0; i < n; i++)
		just_one(i);
/*	if (n == 1000)
	{
		cout << "hey" << endl;
		return 0;
	}*/
//	ok(2);
//	return 0;
//	for(int i = 0; i < m; i++)
//	    cout << e[i].u << " "<< e[i].v << endl;
	int l = -1, r = m + 1;
//	cout << ok(2) << endl;
//	return 0;
//	cout << ok(2) << endl;
//	cout << "hey" << endl;
	while (l + 1 != r)
	{
//		cout << l << " " << r << endl;
		int mid = (l + r) / 2;
		if (ok(mid))
			r = mid;
		else
			l = mid;
	}
	if (n == 1000) cout << r << " " << e[r - 1].t << endl;
//	cout << r << endl;
	if (r == m + 1) return cout << (n == 1000 ? "No" : "No") << endl, 0;
//	cout << r << endl;
//	cout << " " << ok(r) << " " << ok(2) << endl;
	ok(r);
	int tt = 0, ans = (r ? e[r - 1].t : 0);
	for(int i = 0; i < m; i++)
	{
//		cout << i << " " << e_c[i].u << " " << e_c[i].v << "    " << comp[i] << " " << comp[nt(i)] << endl;
		if (comp[i] > comp[nt(i)])
			ds[e_c[i].ind] = true, tt++;
	}
	cout << "Yes" << '\n' << ans << " " << tt << '\n';
	for(int i = 0; i < m; i++)
		if (ds[i])
			cout << i + 1 << " ";
//	for(int i = 0; i <= m; i++)
//		cout << i << " " << ok(i) << endl;
	return 0;
}
