#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
const long long mod = 998244353;
const long long maxn = 5e4 + 10, maxval = 1e9 + 10, mlg = (1 << 18) + 10;
struct edge {
  long long u, v, c, t;
} ed[maxn * 6];
long long n, m, cnt;
long long ans[maxn * 6], comp[maxn * 6], mark1[6 * maxn], mark2[6 * maxn];
vector<long long> ts, nei[maxn * 6][2], adj[maxn * 6];
map<long long, long long> mp;
long long N(long long x) {
  if (x <= m) {
    return x + m;
  } else if (x <= 2 * m) {
    return x - m;
  } else if (x <= 4 * m) {
    return x + 2 * m;
  } else {
    return x - 2 * m;
  }
}
void add_con(long long x, long long y) {
  long long nagh_x = N(x);
  long long nagh_y = N(y);
  nei[nagh_x][1].push_back(y);
  nei[y][0].push_back(nagh_x);
  nei[nagh_y][1].push_back(x);
  nei[x][0].push_back(nagh_y);
}
void dfs1(long long u) {
  mark1[u] = 1;
  for (auto v : nei[u][1]) {
    if (!mark1[v]) {
      dfs1(v);
    }
  }
  ts.push_back(u);
}
void dfs2(long long u) {
  mark2[u] = 1;
  comp[u] = cnt;
  for (auto v : nei[u][0]) {
    if (!mark2[v]) {
      dfs2(v);
    }
  }
}
bool ch(long long x) {
  long long tmp_cnt = 0;
  cnt = 0;
  for (int i = 0; i <= 6 * m; i++) {
    nei[i][1].clear();
    nei[i][0].clear();
    comp[i] = 0;
    mark1[i] = 0;
    mark2[i] = 0;
    ans[i] = 0;
  }
  for (int i = 0; i < m; i++) {
    if (ed[i + 1].t > x) {
      nei[i + 1][1].push_back(i + 1 + m);
      nei[i + 1 + m][0].push_back(i + 1);
    }
  }
  for (int i = 1; i <= n; i++) {
    mp.clear();
    for (int j = 0; j < adj[i].size(); j++) {
      tmp_cnt++;
      if (j > 0) {
        add_con(N(2 * m + tmp_cnt - 1), N(adj[i][j]));
        add_con(N(2 * m + tmp_cnt - 1), 2 * m + tmp_cnt);
        add_con(N(adj[i][j]), 2 * m + tmp_cnt);
      } else {
        add_con(N(adj[i][j]), 2 * m + tmp_cnt);
      }
      if (!mp[ed[adj[i][j]].c]) {
        mp[ed[adj[i][j]].c] = adj[i][j];
      } else if (mp[ed[adj[i][j]].c] == -1) {
        return false;
      } else {
        add_con(adj[i][j], mp[ed[adj[i][j]].c]);
        mp[ed[adj[i][j]].c] = -1;
      }
    }
  }
  for (int i = 1; i <= 6 * m; i++) {
    if (!mark1[i]) {
      dfs1(i);
    }
  }
  while (!ts.empty()) {
    long long v = ts.back();
    ts.pop_back();
    if (!mark2[v]) {
      cnt++;
      dfs2(v);
    }
  }
  for (int i = 1; i <= m; i++) {
    if (comp[i] == comp[i + m]) {
      return false;
    }
    if (comp[i] > comp[i + m]) {
      ans[i] = 1;
    } else {
      ans[i] = 0;
    }
  }
  for (int i = 2 * m + 1; i <= 4 * m; i++) {
    if (comp[i] == comp[i + 2 * m]) {
      return false;
    }
  }
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> ed[i + 1].u >> ed[i + 1].v >> ed[i + 1].c >> ed[i + 1].t;
    adj[ed[i + 1].u].push_back(i + 1);
    adj[ed[i + 1].v].push_back(i + 1);
  }
  long long l = -1, r = inf;
  while (r - l > 1) {
    long long mid = (l + r) / 2;
    if (ch(mid)) {
      r = mid;
    } else {
      l = mid;
    }
  }
  if (r == inf) {
    cout << "No" << endl;
    return 0;
  }
  cout << "Yes" << endl;
  ch(r);
  long long tmp = 0;
  for (int i = 0; i < m; i++) {
    if (ans[i + 1]) {
      tmp++;
    }
  }
  cout << r << ' ' << tmp << endl;
  for (int i = 0; i < m; i++) {
    if (ans[i + 1]) {
      cout << i + 1 << ' ';
    }
  }
  cout << endl;
}
