#include <bits/stdc++.h>
using namespace std;
const int N = 404040;
int cnt, cnt2, cnt3, h, n, m;
struct Node {
  int x, y, w, d, i;
} a[N];
bool cmp(Node x, Node y) { return x.d < y.d; }
vector<int> s[N];
vector<pair<int, int> > ss[N];
int dfn[N], low[N], viss[N], q[N], color[N], as[N];
map<int, int> sum, vis;
void jiantu(int x, int y) { s[x].push_back(y); }
void tarjan(int x) {
  int c, i, y;
  q[h++] = x, viss[x] = 1;
  dfn[x] = low[x] = ++cnt2;
  c = s[x].size();
  for (i = 0; i < c; i++) {
    y = s[x][i];
    if (!dfn[y])
      tarjan(y), low[x] = min(low[x], low[y]);
    else if (viss[y])
      low[x] = min(low[x], dfn[y]);
  }
  if (low[x] == dfn[x]) {
    cnt3++;
    while (1) {
      h--;
      color[q[h]] = cnt3;
      viss[q[h]] = 0;
      if (q[h] == x) {
        q[h] = 0;
        break;
      }
      q[h] = 0;
    }
  }
}
int check(int x) {
  int i, ans = 1;
  for (i = x + 1; i <= m; i++) jiantu(i + i, i + i - 1);
  cnt2 = 0, cnt3 = 0;
  memset(dfn, 0, sizeof(dfn));
  memset(low, 0, sizeof(low));
  memset(viss, 0, sizeof(viss));
  memset(color, 0, sizeof(color));
  for (i = 1; i <= cnt; i++)
    if (!dfn[i]) h = 0, tarjan(i);
  for (i = 1; i <= m; i++)
    if (color[i + i - 1] == color[i + i]) ans = 0;
  for (i = x + 1; i <= m; i++) s[i + i].pop_back();
  return ans;
}
int erf(int l, int r) {
  while (l <= r) {
    int mid = l + r >> 1;
    if (check(mid))
      r = mid - 1;
    else
      l = mid + 1;
  }
  return l;
}
void init() {
  int c, i, y, j, pl;
  cnt = m + m;
  for (i = 1; i <= n; i++) {
    c = ss[i].size();
    for (j = 0; j < c; j++) {
      y = ss[i][j].first;
      pl = ss[i][j].second;
      sum[a[pl].w]++;
      if (sum[a[pl].w] == 3) {
        puts("No");
        exit(0);
      } else if (sum[a[pl].w] == 2) {
        jiantu(vis[a[pl].w] * 2 - 1, pl + pl);
        jiantu(pl + pl - 1, vis[a[pl].w] * 2);
      }
      vis[a[pl].w] = pl;
    }
    for (j = 0; j < c; j++) sum[a[ss[i][j].second].w]--;
    for (j = 0; j < c; j++) {
      y = ss[i][j].second;
      if (j != c - 1) {
        cnt++;
        if (j != 0) jiantu(cnt, cnt - 1);
        jiantu(cnt, y + y - 1);
      }
      if (j != 0) {
        if (j != c - 1)
          jiantu(y + y, cnt - 1);
        else
          jiantu(y + y, cnt);
      }
    }
    for (j = c - 1; j >= 0; j--) {
      y = ss[i][j].second;
      if (j != 0) {
        cnt++;
        jiantu(cnt, y + y - 1);
        if (j != c - 1) jiantu(cnt, cnt - 1);
      }
      if (j != c - 1) {
        if (j != 0)
          jiantu(y + y, cnt - 1);
        else
          jiantu(y + y, cnt);
      }
    }
  }
}
int main() {
  int i, ans, cnt;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= m; i++)
    scanf("%d%d%d%d", &a[i].x, &a[i].y, &a[i].w, &a[i].d), a[i].i = i;
  sort(a + 1, a + m + 1, cmp);
  for (i = 1; i <= m; i++)
    ss[a[i].x].push_back(make_pair(a[i].y, i)),
        ss[a[i].y].push_back(make_pair(a[i].x, i));
  init();
  ans = erf(0, m);
  if (!check(ans)) {
    puts("No");
    return 0;
  }
  puts("Yes");
  cnt = 0;
  for (i = 1; i <= m; i++)
    if (color[i + i - 1] > color[i + i]) as[++cnt] = a[i].i;
  printf("%d %d\n", a[ans].d, cnt);
  for (i = 1; i <= cnt; i++) printf("%d ", as[i]);
  return 0;
}
