#include <bits/stdc++.h>
using namespace std;
int const mxn = 3e5 + 10;
long long inf = 1e9;
vector<int> ans;
vector<int> we[mxn];
vector<pair<int, int> > adj[mxn];
set<pair<long long, long long> > q;
long long dis[mxn];
int mark[mxn];
pair<int, int> father[mxn];
set<pair<int, int> > points;
void dij(int v) {
  while (q.size()) {
    pair<long long, long long> a = *q.begin();
    int u = a.second;
    q.erase(a);
    mark[u] = 1;
    for (int j = 0; j < adj[u].size(); j++) {
      int i = adj[u][j].first;
      int t = adj[u][j].second;
      if (mark[i]) continue;
      if (dis[i] > dis[u] + we[u][j]) {
        q.erase({dis[i], i});
        dis[i] = dis[u] + we[u][j];
        father[i] = {u, t};
        q.insert({dis[u] + we[u][j], i});
      }
    }
  }
}
int findway(int v) {
  if (father[v].second != 0) ans.push_back(father[v].second);
  if (v == 0) return 1;
  return findway(father[v].first);
}
long long n, l;
int main() {
  cin >> n >> l;
  long long j = 1;
  points.insert({0, 0});
  for (int i = 1; i <= n; i++) {
    long long x, d, t, p;
    cin >> x >> d >> t >> p;
    if (x - p < 0 or t >= d) continue;
    points.insert({x - p, j});
    points.insert({x + d, j + 1});
    adj[j].push_back({j + 1, i});
    we[j].push_back(t + p);
    j = j + 2;
  }
  points.insert({l, j});
  auto f = *points.begin();
  points.erase(f);
  for (auto i : points) {
    adj[f.second].push_back({i.second, 0});
    adj[i.second].push_back({f.second, 0});
    we[i.second].push_back(abs(f.first - i.first));
    we[f.second].push_back(abs(i.first - f.first));
    f = i;
  }
  fill(dis, dis + mxn, inf);
  dis[0] = 0;
  q.insert({0, 0});
  for (auto i : points) {
    q.insert({dis[i.second], i.second});
  }
  dij(0);
  cout << dis[j] << endl;
  findway(j);
  cout << ans.size() << endl;
  reverse(ans.begin(), ans.end());
  for (auto i : ans) cout << i << "\n";
}
