#include <bits/stdc++.h>
using namespace std;
const int N = 1110000;
struct node {
  int nxt, ed, len, id;
} e[N];
vector<int> v;
vector<int> ans;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>
    q;
int head[N], num, x[N], d[N], p[N], t[N], dis[N], flag[N], ff[N], pre[N];
void add(int x, int y, int z, int id) {
  e[num].nxt = head[x];
  e[num].ed = y, e[num].len = z, e[num].id = id;
  head[x] = num++;
}
void init() {
  memset(head, -1, sizeof(head));
  memset(dis, 0x3f, sizeof(dis));
  num = 0;
}
int getid(int x) { return lower_bound(v.begin(), v.end(), x) - v.begin(); }
int dij(int st) {
  dis[st] = 0;
  q.push(make_pair(0, 0));
  while (!q.empty()) {
    int tt = q.top().second;
    flag[tt] = 1;
    q.pop();
    for (int i = head[tt]; ~i; i = e[i].nxt) {
      int v = e[i].ed, len = e[i].len, id = e[i].id;
      if (flag[v]) continue;
      if (dis[v] > dis[tt] + len) {
        dis[v] = dis[tt] + len;
        pre[v] = tt;
        ff[v] = id;
        q.push(make_pair(dis[v], v));
      }
    }
  }
  return dis[(int)v.size() - 1];
}
int main() {
  int n, L;
  init();
  scanf("%d%d", &n, &L);
  v.push_back(0), v.push_back(L);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d%d", &x[i], &d[i], &t[i], &p[i]);
    if (x[i] - p[i] < 0) continue;
    v.push_back(x[i] - p[i]), v.push_back(x[i] + d[i]);
  }
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  for (int i = 0; i < (int)v.size() - 1; i++) {
    add(i, i + 1, v[i + 1] - v[i], 0);
    add(i + 1, i, v[i + 1] - v[i], 0);
  }
  for (int i = 1; i <= n; i++) {
    if (x[i] - p[i] < 0) continue;
    add(getid(x[i] - p[i]), getid(x[i] + d[i]), t[i] + p[i], i);
  }
  printf("%d\n", dij(0));
  int ed = (int)v.size() - 1;
  while (ed != 0) {
    if (ff[ed] != 0) ans.push_back(ff[ed]);
    ed = pre[ed];
  }
  printf("%d\n", (int)ans.size());
  for (int i = (int)ans.size() - 1; i >= 0; i--) printf("%d ", ans[i]);
  return 0;
}
