#include <bits/stdc++.h>
using namespace std;
const int N = 1000 * 1000 + 10;
const long long int mod = 1000 * 1000 * 1000 + 7;
const long long int inf = 1e16;
vector<int> v;
vector<int> ans;
vector<pair<pair<int, long long int>, int>> adj[N];
set<pair<long long int, int>> second;
long long int dp[N];
map<int, int> ind;
set<int> st;
int par[N], edge[N];
void dij() {
  int n = st.size();
  for (int i = 1; i < n; i++) {
    dp[i] = inf;
    second.insert({dp[i], i});
    par[i] = -1;
    edge[i] = -1;
  }
  second.insert({dp[0], 0});
  par[0] = -1;
  edge[0] = -1;
  while (!second.empty()) {
    int x = second.begin()->second;
    second.erase(second.begin());
    for (int i = 0; i < adj[x].size(); i++) {
      int y = adj[x][i].first.first, t = adj[x][i].second;
      long long int w = adj[x][i].first.second;
      if (dp[y] > dp[x] + w) {
        second.erase({dp[y], y});
        dp[y] = dp[x] + w;
        second.insert({dp[y], y});
        edge[y] = t;
        par[y] = x;
      }
    }
  }
  return;
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  int n, l;
  cin >> n >> l;
  ind[0] = 0;
  ind[l] = 1;
  st.insert(0);
  st.insert(l);
  int cnt = 2;
  for (int i = 0; i < n; i++) {
    int x, d, t, p;
    cin >> x >> d >> t >> p;
    if (x - p < 0) continue;
    auto it = st.lower_bound(x - p);
    if (it == st.end() || *it != x - p) {
      ind[x - p] = cnt;
      cnt++;
    }
    it = st.lower_bound(x + d);
    if (it == st.end() || *it != x + d) {
      ind[x + d] = cnt;
      cnt++;
    }
    adj[ind[x - p]].push_back({{ind[x + d], t + p}, i + 1});
    st.insert(x - p);
    st.insert(x + d);
  }
  auto it = st.begin();
  while (it != st.end()) {
    v.push_back(*it);
    it++;
  }
  for (int i = 0; i < v.size() - 1; i++) {
    int x = v[i], y = v[i + 1];
    int d = abs(x - y);
    adj[ind[x]].push_back({{ind[y], d}, -1});
    adj[ind[y]].push_back({{ind[x], d}, -1});
  }
  dij();
  int x = ind[l];
  cout << dp[x] << endl;
  while (par[x] != -1) {
    if (edge[x] != -1) ans.push_back(edge[x]);
    x = par[x];
  }
  reverse(ans.begin(), ans.end());
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) cout << ans[i] << ' ';
  cout << endl;
  return 0;
}
