#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) { return a * b / gcd(a, b); }
long long qp(long long a, long long b, long long p) {
  long long ans = 1;
  while (b) {
    if (b & 1) {
      ans = (ans * a) % p;
      --b;
    }
    a = (a * a) % p;
    b >>= 1;
  }
  return ans % p;
}
long long Inv(long long x) { return qp(x, mod - 2, mod); }
long long C(long long n, long long m) {
  if (m > n) return 0;
  long long ans = 1;
  for (int i = 1; i <= m; ++i) ans = ans * Inv(i) % mod * (n - i + 1) % mod;
  return ans % mod;
}
inline int read() {
  int s = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    s = (s << 3) + (s << 1) + (ch ^ 48);
    ch = getchar();
  }
  return s * w;
}
const int N = 1010000;
typedef struct Node {
  long long s, t, w, id;
  Node(long long a, long long b, long long c, long long d) {
    s = a;
    t = b;
    w = c;
    id = d;
  }
  Node() {}
} Node;
typedef struct Edge1 {
  long long v;
  long long w;
  Edge1() {}
  Edge1(long long a, long long b) {
    v = a;
    w = b;
  }
} Edge1;
struct cmp {
  bool operator()(const Edge1 &a, const Edge1 &b) { return a.w > b.w; }
};
long long n, m, x, L;
long long dist[N];
long long vis[N], cnt, len, pre[N], dfn[N];
long long a[N];
long long head[N], ver[N << 1], Next[N << 1], Edge[N << 1], edge[N << 1], tot;
Node node[N];
long long top;
long long ans[N], limit;
priority_queue<Edge1, vector<Edge1>, cmp> Q;
void add(long long u, long long v, long long w, long long id) {
  ver[++tot] = v;
  Edge[tot] = w;
  edge[tot] = id;
  Next[tot] = head[u];
  head[u] = tot;
}
void Dijskla(long long x, long long fa) {
  for (int i = 0; i <= len; i++) dist[i] = 1e18;
  pre[x] = fa;
  dfn[x] = 0;
  Q.push({x, 0});
  vis[x] = 1;
  dist[x] = 0;
  while (!Q.empty()) {
    Edge1 T = Q.top();
    Q.pop();
    long long u = T.v;
    long long w = T.w;
    vis[u] = 0;
    for (int i = head[u]; i; i = Next[i]) {
      long long v = ver[i];
      long long W = Edge[i];
      if (dist[v] <= dist[u] + W) continue;
      dist[v] = dist[u] + W;
      pre[v] = u;
      dfn[v] = edge[i];
      Q.push({v, dist[v]});
      vis[v] = 1;
    }
  }
  long long t = len;
  while (t != 0) {
    long long fa = pre[t];
    long long id = dfn[t];
    if (id > 0) {
      ans[++limit] = id;
    }
    t = fa;
  }
}
int main() {
  n = read();
  L = read();
  a[++cnt] = 0;
  a[++cnt] = L;
  for (int i = 1; i <= n; i++) {
    long long x, d, t, p;
    scanf("%lld%lld", &x, &d);
    ;
    scanf("%lld%lld", &t, &p);
    ;
    if (x - p < 0 || x + d > L) continue;
    node[++top] = {x - p, x + d, t + p, i};
    a[++cnt] = x - p;
    a[++cnt] = x + d;
  }
  sort(a + 1, a + cnt + 1);
  len = unique(a + 1, a + cnt + 1) - a - 1;
  for (int i = 1; i <= top; i++) {
    long long x = lower_bound(a + 1, a + len + 1, node[i].s) - a;
    long long y = lower_bound(a + 1, a + len + 1, node[i].t) - a;
    long long w = node[i].w;
    add(x, y, w, node[i].id);
  }
  for (int i = 2; i <= len; i++) {
    long long x = i - 1, y = i;
    long long w = a[y] - a[x];
    add(x, y, w, 0);
    add(y, x, w, 0);
  }
  Dijskla(1, 0);
  if (1 == 0)
    printf("%lld ", dist[len]);
  else
    printf("%lld\n", dist[len]);
  ;
  if (1 == 0)
    printf("%lld ", limit);
  else
    printf("%lld\n", limit);
  ;
  for (int i = limit; i >= 1; i--) printf("%lld ", ans[i]);
  printf("\n");
  return 0;
}
