#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200200;
const int INF = 1000000007;
struct Ramp {
  int i, x, d, t, p;
  bool operator<(int o) const { return x < o; }
  bool operator<(const Ramp& o) const { return x < o.x; }
} r[MAXN], rr;
struct Edge {
  int a, b, c, t;
  Edge(int a, int b, int c, int t = -1) : a(a), b(b), c(c), t(t) {}
};
vector<Edge> e[MAXN];
int d[MAXN];
const Edge* pre[MAXN];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) {
    r[i].i = i + 1;
    scanf("%d%d%d%d", &r[i].x, &r[i].d, &r[i].t, &r[i].p);
    r[n + i].i = -1;
    r[n + i].x = r[i].x + r[i].d;
  }
  n += n;
  r[n].x = 0;
  r[n + 1].x = m;
  r[n].i = r[n + 1].i = -1;
  n += 2;
  sort(r, r + n);
  for (int i = 1; i < n; ++i) {
    e[i - 1].push_back(Edge(i - 1, i, r[i].x - r[i - 1].x));
    e[i].push_back(Edge(i, i - 1, r[i].x - r[i - 1].x));
  }
  for (int i = 0; i < n; ++i) {
    if (r[i].i == -1 || r[i].x < r[i].p) {
      continue;
    }
    rr.x = r[i].x - r[i].p;
    int a = lower_bound(r, r + n, rr) - r;
    rr.x = r[i].x + r[i].d;
    int b = lower_bound(r, r + n, rr) - r;
    for (int aa = a - 1; aa <= a; ++aa) {
      for (int bb = b; bb <= b; ++bb) {
        if (0 <= aa && aa < bb && bb < n) {
          int cc = r[i].p + r[i].t;
          cc += abs(r[i].x - r[i].p - r[aa].x);
          cc += abs(r[i].x + r[i].d - r[bb].x);
          e[aa].push_back(Edge(aa, bb, cc, r[i].i));
        }
      }
    }
  }
  priority_queue<pair<int, int>, vector<pair<int, int> >,
                 greater<pair<int, int> > >
      q;
  fill(d, d + n, INF);
  fill(pre, pre + n, (Edge*)NULL);
  d[0] = 0;
  q.push({d[0], 0});
  while (!q.empty()) {
    int t = q.top().first;
    int v = q.top().second;
    q.pop();
    if (d[v] != t) {
      continue;
    }
    for (const Edge& w : e[v]) {
      if (d[w.b] > t + w.c) {
        d[w.b] = t + w.c;
        q.push({d[w.b], w.b});
        pre[w.b] = &w;
      }
    }
  }
  printf("%d\n", d[n - 1]);
  vector<int> ans;
  for (int i = n - 1; i > 0; i = pre[i]->a) {
    if (pre[i]->t != -1) {
      ans.push_back(pre[i]->t);
    }
  }
  reverse(ans.begin(), ans.end());
  printf("%d\n", (int)ans.size());
  for (int i : ans) {
    printf("%d ", i);
  }
  return 0;
}
