#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:640000000")
using namespace std;
const double eps = 1e-9;
const double pi = acos(-1.0);
template <class T>
T sqr(T x) {
  return x * x;
}
const int maxn = (int)(1e5) + 10;
const int inf = (int)(2e9);
struct Edge {
  int to, w, num;
  Edge() : to(0), w(0), num(0) {}
  Edge(int to, int w, int num) : to(to), w(w), num(num) {}
};
int n, L;
int x[maxn], d[maxn], t[maxn], p[maxn];
vector<Edge> g[2 * maxn];
vector<int> pt;
int dist[2 * maxn], pred[2 * maxn], num[2 * maxn];
int main() {
  scanf("%d%d", &n, &L);
  set<int> spt;
  spt.insert(0);
  pt.push_back(0);
  spt.insert(L);
  pt.push_back(L);
  for (int i = 0; i < n; i++) {
    scanf("%d%d%d%d", &x[i], &d[i], &t[i], &p[i]);
    if (d[i] <= t[i] || x[i] - p[i] < 0) continue;
    if (spt.find(x[i] - p[i]) == spt.end()) {
      pt.push_back(x[i] - p[i]);
      spt.insert(x[i] - p[i]);
    }
    if (spt.find(x[i] + d[i]) == spt.end()) {
      pt.push_back(x[i] + d[i]);
      spt.insert(x[i] + d[i]);
    }
  }
  sort(pt.begin(), pt.end());
  int N = (int)((pt).size());
  for (int i = 0; i < n; i++) {
    if (d[i] <= t[i] || x[i] - p[i] < 0) continue;
    int v = int(lower_bound(pt.begin(), pt.end(), x[i] - p[i]) - pt.begin());
    int u = int(lower_bound(pt.begin(), pt.end(), x[i] + d[i]) - pt.begin());
    g[v].push_back(Edge(u, p[i] + t[i], i + 1));
  }
  for (int i = 0; i < N - 1; i++) {
    g[i].push_back(Edge(i + 1, pt[i + 1] - pt[i], 0));
    g[i + 1].push_back(Edge(i, pt[i + 1] - pt[i], 0));
  }
  set<pair<int, int> > sd;
  for (int i = 0; i < N; i++) {
    dist[i] = inf;
    pred[i] = -1;
    num[i] = 0;
  }
  dist[0] = 0;
  sd.insert(make_pair(0, 0));
  while (!sd.empty()) {
    int v = sd.begin()->second;
    sd.erase(sd.begin());
    for (int i = 0; i < g[v].size(); i++) {
      if (dist[g[v][i].to] > dist[v] + g[v][i].w) {
        sd.erase(make_pair(dist[g[v][i].to], g[v][i].to));
        dist[g[v][i].to] = dist[v] + g[v][i].w;
        pred[g[v][i].to] = v;
        num[g[v][i].to] = g[v][i].num;
        sd.insert(make_pair(dist[g[v][i].to], g[v][i].to));
      }
    }
  }
  cout << dist[N - 1] << endl;
  vector<int> trp;
  for (int v = N - 1; pred[v] != -1; v = pred[v]) {
    if (num[v] != 0) trp.push_back(num[v]);
  }
  reverse(trp.begin(), trp.end());
  cout << (int)((trp).size()) << endl;
  for (int i = 0; i < (int)((trp).size()); i++) {
    cout << trp[i] << " ";
  }
  return 0;
}
