#include <bits/stdc++.h>
using namespace std;
const long long MXN = 500 + 10;
const long long MXM = (1LL << 18) + 10;
const long long MX5 = 3e5 + 10;
const long long MX6 = 1e6 + 10;
const long long LOG = 20;
const long long INF = 8e18;
const double eps = 1e-9;
const long long MOD = 1e9 + 7;
long long power(long long a, long long b, long long md) {
  return (!b ? 1
             : (b & 1 ? a * power(a * a % md, b / 2, md) % md
                      : power(a * a % md, b / 2, md) % md));
}
long long bmm(long long a, long long b) {
  return (a % b == 0 ? b : bmm(b, a % b));
}
string base2(long long n) {
  string a = "";
  while (n >= 2) {
    a += (char)(n % 2 + '0');
    n /= 2;
  }
  a += (char)(n + '0');
  reverse((a).begin(), (a).end());
  return a;
}
long long n, L, ans;
long long dis[MX5], ID[MX5], par[MX5];
vector<pair<long long, long long>> G[MX5];
vector<pair<pair<long long, long long>, long long>> E;
map<long long, long long> mp;
set<int> V;
set<pair<long long, long long>> st;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>
    pq;
bool vis[MX5], mark[MX5];
map<pair<pair<long long, long long>, long long>, long long> edge;
vector<long long> ANS;
inline void Dijkstra(long long second) {
  fill(dis, dis + MX5, INF);
  dis[second] = 0;
  pq.push({0, second});
  while (!pq.empty()) {
    int u = pq.top().second, cost = pq.top().first;
    pq.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (pair<int, int> PR : G[u]) {
      long long v = PR.first, w = PR.second;
      if (!vis[v] && dis[v] > cost + w) {
        dis[v] = cost + w;
        pq.push({dis[v], v});
        ID[v] = edge[{{u, v}, w}];
        par[v] = u;
      }
    }
  }
  return;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> L;
  for (int i = 0; i < n; i++) {
    int x, d, t, p;
    cin >> x >> d >> t >> p;
    int u = x - p, v = x + d, w = t + p;
    E.push_back({{u, v}, w});
    if (u < 0) continue;
    V.insert(u);
    V.insert(v);
  }
  V.insert(0);
  V.insert(L);
  int p = 1;
  for (auto x : V) {
    mp[x] = p;
    p++;
  }
  for (std::set<int>::iterator itr = V.begin(); itr != V.end(); itr++) {
    std::set<int>::iterator itr2 = itr;
    itr2++;
    if (itr2 == V.end()) break;
    int w = *itr2 - *itr;
    G[mp[*itr]].push_back({mp[*itr2], w});
    G[mp[*itr2]].push_back({mp[*itr], w});
  }
  n = V.size();
  for (int i = 0; i < E.size(); i++) {
    int u = E[i].first.first, v = E[i].first.second, w = E[i].second;
    if (u < 0) continue;
    u = mp[u];
    v = mp[v];
    G[u].push_back({v, w});
    edge[{{u, v}, w}] = i + 1;
  }
  Dijkstra(mp[0]);
  cout << dis[mp[L]] << '\n';
  long long now = mp[L];
  while (now != 0) {
    if (ID[now] != 0) ANS.push_back(ID[now]);
    now = par[now];
  }
  cout << ANS.size() << '\n';
  reverse((ANS).begin(), (ANS).end());
  for (auto X : ANS) cout << X << ' ';
  return 0;
}
