#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2, class T3 = hash<T1>>
using umap = unordered_map<T1, T2, T3>;
template <class T>
using uset = unordered_set<T>;
template <class T>
using vec = vector<T>;
const long long infll = numeric_limits<long long>::max() >> 1;
const long long inf = numeric_limits<long long>::max() >> 1;
const long long N = 2e5 + 10;
long long n, l;
vec<long long> sml;
vec<long long> ans;
struct Graph {
  long long dst[N];
  long long par[N];
  long long pre[N];
  vec<pair<long long, long long>> adj[N];
  vec<long long> ind[N];
} graph;
struct Edge {
  long long u, v, w;
} edge[N];
void input() {
  cin >> n >> l;
  sml.push_back(0);
  sml.push_back(l);
  for (long long i = 0; i < n; ++i) {
    long long x;
    cin >> x;
    long long d;
    cin >> d;
    long long t;
    cin >> t;
    long long p;
    cin >> p;
    if (x >= p) {
      sml.push_back(x - p);
      sml.push_back(x + d);
      edge[i] = {x - p, x + d, t + p};
    } else {
      edge[i] = {-1, -1, -1};
    }
  }
}
long long dijkstra() {
  auto cmp = [](long long x, long long y) {
    return graph.dst[x] > graph.dst[y];
  };
  fill(graph.dst, graph.dst + N, inf);
  priority_queue<long long, vec<long long>, decltype(cmp)> pq(cmp);
  graph.dst[0] = 0;
  pq.push(0);
  while (!pq.empty()) {
    long long u = pq.top();
    pq.pop();
    for (long long i = 0; i < (long long)graph.adj[u].size(); ++i) {
      pair<long long, long long> p = graph.adj[u][i];
      long long v = p.first;
      long long w = p.second;
      if (graph.dst[v] > graph.dst[u] + w) {
        graph.dst[v] = graph.dst[u] + w;
        graph.pre[v] = graph.ind[u][i];
        graph.par[v] = u;
        pq.push(v);
      }
    }
  }
  return graph.dst[(long long)sml.size() - 1];
}
void construct(long long u) {
  if (u == 0) {
    return;
  }
  if (graph.pre[u]) {
    ans.push_back(graph.pre[u]);
  }
  construct(graph.par[u]);
}
void solve() {
  sort((sml).begin(), (sml).end());
  for (long long i = 0; i < n; ++i) {
    long long u = edge[i].u;
    long long v = edge[i].v;
    long long w = edge[i].w;
    if (u == -1) {
      continue;
    }
    u = lower_bound((sml).begin(), (sml).end(), u) - sml.begin();
    v = lower_bound((sml).begin(), (sml).end(), v) - sml.begin();
    graph.adj[u].push_back({v, w});
    graph.ind[u].push_back(i + 1);
  }
  for (long long i = 1; i < (long long)sml.size(); ++i) {
    graph.adj[i].push_back({i - 1, abs(sml[i] - sml[i - 1])});
    graph.ind[i].push_back(0);
    graph.adj[i - 1].push_back({i, abs(sml[i] - sml[i - 1])});
    graph.ind[i - 1].push_back(0);
  }
  cout << dijkstra() << "\n";
  construct((long long)sml.size() - 1);
  cout << (long long)ans.size() << "\n";
  reverse((ans).begin(), (ans).end());
  for (long long e : ans) {
    cout << e << " ";
  }
  cout << "\n";
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  input();
  solve();
}
