#include <bits/stdc++.h>
using namespace std;
int main() {
  vector<pair<int, int> > v;
  vector<vector<pair<int, pair<int, int> > > > path;
  vector<pair<int, int> > rampbuf;
  vector<pair<int, int> > ans;
  vector<int> D;
  priority_queue<pair<int, int>, vector<pair<int, int> >,
                 greater<pair<int, int> > >
      q;
  int n, L, x, d, t, p;
  pair<int, int> buf;
  cin >> n >> L;
  buf.first = 0;
  buf.second = -(n + 10000);
  v.push_back(buf);
  buf.first = L;
  buf.second = (n + 10000);
  v.push_back(buf);
  for (int i = 0; i < n; i++) {
    cin >> x >> d >> t >> p;
    if (x - p >= 0) {
      buf.first = x - p;
      buf.second = -(i + 1);
      v.push_back(buf);
      buf.first = x + d;
      buf.second = i + 1;
      v.push_back(buf);
    }
    buf.first = -1;
    buf.second = t + p;
    rampbuf.push_back(buf);
  }
  sort(v.begin(), v.end());
  int num = 0;
  pair<int, pair<int, int> > edge;
  path.push_back(vector<pair<int, pair<int, int> > >());
  edge.first = 1;
  edge.second.first = 0;
  edge.second.second = -1;
  path[0].push_back(edge);
  for (int i = 1; i < v.size(); i++) {
    if (v[i - 1].first != v[i].first) {
      path[num][0].second.first = v[i].first - v[i - 1].first;
      num++;
      path.push_back(vector<pair<int, pair<int, int> > >());
      edge.first = num + 1;
      edge.second.second = -1;
      path[num].push_back(edge);
      edge.first = num - 1;
      edge.second.first = v[i].first - v[i - 1].first;
      edge.second.second = -1;
      path[num].push_back(edge);
    }
    if (v[i].second != -n - 10000 && v[i].second < 0) {
      rampbuf[-v[i].second - 1].first = num;
    } else if (v[i].second != n + 10000 && v[i].second > 0) {
      edge.first = num;
      edge.second.first = rampbuf[v[i].second - 1].second;
      edge.second.second = v[i].second - 1;
      path[rampbuf[v[i].second - 1].first].push_back(edge);
    }
  }
  for (int i = 0; i < path.size(); i++) {
    ans.push_back(pair<int, int>());
    D.push_back(L + 100);
  }
  buf.first = 0;
  buf.second = 0;
  while (buf.second != path.size() - 1) {
    if (D[buf.second] >= buf.first) {
      D[buf.second] = buf.first;
      num = buf.second;
      for (int i = 0; i < path[num].size(); i++) {
        buf.first = D[num] + path[num][i].second.first;
        buf.second = path[num][i].first;
        if (D[buf.second] > buf.first) {
          D[buf.second] = buf.first;
          q.push(buf);
          ans[buf.second].first = num;
          ans[buf.second].second = i;
        }
      }
    }
    buf = q.top();
    q.pop();
  }
  cout << buf.first << endl;
  vector<int> route;
  num = path.size() - 1;
  while (num != 0) {
    if (-1 != path[ans[num].first][ans[num].second].second.second)
      route.push_back(path[ans[num].first][ans[num].second].second.second);
    num = ans[num].first;
  }
  cout << route.size() << endl;
  if (route.size() != 0) {
    for (int i = route.size() - 1; i >= 0; i--) {
      if (i == route.size() - 1)
        cout << route[i] + 1;
      else
        cout << " " << route[i] + 1;
    }
    cout << endl;
  }
  return 0;
}
