#include <bits/stdc++.h>
using namespace std;
struct ramp {
  int x, d, t, p;
};
ramp a[100009];
vector<int> idx;
int dis[300009], par[300009], n, l, ra[300009];
int id(int val) {
  int ans = lower_bound(idx.begin(), idx.end(), val) - idx.begin();
  return ans;
}
vector<int> ans;
vector<vector<int> > sta;
void trace(int id) {
  if (idx[id] == 0) return;
  if (ra[id] != -1) ans.push_back(ra[id]);
  trace(par[id]);
}
int main() {
  set<int> tmp;
  scanf("%d", &n);
  scanf("%d", &l);
  tmp.insert(0);
  for (int i = int(0); i <= int(n - 1); i++) {
    scanf("%d", &a[i].x);
    scanf("%d", &a[i].d);
    scanf("%d", &a[i].t);
    scanf("%d", &a[i].p);
    a[i].p = a[i].x - a[i].p;
    a[i].d = a[i].x + a[i].d;
    tmp.insert(a[i].x);
    tmp.insert(a[i].p);
    tmp.insert(a[i].d);
  }
  tmp.insert(l);
  set<int>::iterator it = tmp.begin();
  while (it != tmp.end()) {
    idx.push_back(*it);
    it++;
  }
  sta.resize(tmp.size());
  for (int i = int(0); i <= int(n - 1); i++) {
    sta[id(a[i].p)].push_back(i);
  }
  for (int i = int(0); i <= int(tmp.size()); i++) dis[i] = 2000000000;
  memset(ra, -1, sizeof(ra));
  memset(par, -1, sizeof(par));
  priority_queue<pair<int, int>, vector<pair<int, int> >,
                 greater<pair<int, int> > >
      pq;
  dis[id(0)] = 0;
  pq.push(pair<int, int>(0, id(0)));
  while (!pq.empty()) {
    pair<int, int> u = pq.top();
    pq.pop();
    if (u.first == dis[u.second]) {
      if (u.second - 1 >= 0 && idx[u.second - 1] >= 0 &&
          dis[u.second - 1] >
              dis[u.second] + (idx[u.second] - idx[u.second - 1])) {
        par[u.second - 1] = u.second;
        ra[u.second - 1] = -1;
        dis[u.second - 1] = dis[u.second] + (idx[u.second] - idx[u.second - 1]);
        pq.push(pair<int, int>(dis[u.second - 1], u.second - 1));
      }
      if (u.second + 1 < tmp.size() &&
          dis[u.second + 1] >
              dis[u.second] + (-1 * idx[u.second] + idx[u.second + 1])) {
        par[u.second + 1] = u.second;
        ra[u.second + 1] = -1;
        dis[u.second + 1] =
            dis[u.second] + (-1 * idx[u.second] + idx[u.second + 1]);
        pq.push(pair<int, int>(dis[u.second + 1], u.second + 1));
      }
      for (vector<int>::iterator it = (sta[u.second]).begin();
           it != (sta[u.second]).end(); it++) {
        int id1 = id(a[*it].d);
        if (dis[id1] > dis[u.second] + (a[*it].x - a[*it].p) + (a[*it].t)) {
          par[id1] = u.second;
          ra[id1] = *it;
          dis[id1] = dis[u.second] + (a[*it].x - a[*it].p) + (a[*it].t);
          pq.push(pair<int, int>(dis[id1], id1));
        }
      }
    }
  }
  trace(id(l));
  printf("%d\n%d\n", dis[id(l)], ans.size());
  reverse(ans.begin(), ans.end());
  for (vector<int>::iterator it = (ans).begin(); it != (ans).end(); it++) {
    printf("%d ", *it + 1);
  }
  return 0;
}
