#include <bits/stdc++.h>
using namespace std;
long long max(long long a, long long b) {
  if (a > b) {
    return a;
  } else {
    return b;
  }
}
long long min(long long a, long long b) {
  if (a < b) {
    return a;
  } else {
    return b;
  }
}
int dp[601][1021];
int nxt[601];
int n, s;
struct data {
  int in, out, v, w, s;
} d[601];
bool operator<(data u, data v) {
  if (u.in < v.in) return true;
  if (u.in > v.in) return false;
  return u.out > v.out;
}
bool ok(int id1, int id2) {
  return (d[id1].out >= d[id2].out) && (d[id1].in <= d[id2].in) && (id1 != id2);
}
int solve(int a, int b) {
  if (dp[a][b] == -1) {
    int dp2[601];
    dp[a][b] = 0;
    for (int i = (1); i <= (n + 1); i++) dp2[i] = 0;
    for (int i = (1); i <= (n); i++) {
      dp2[i + 1] = max(dp2[i + 1], dp2[i]);
      if (d[i].w <= b && ok(a, i)) {
        dp2[nxt[i]] = max(dp2[nxt[i]],
                          dp2[i] + d[i].v + solve(i, min(b - d[i].w, d[i].s)));
      }
    }
    dp[a][b] = dp2[n + 1];
  }
  return dp[a][b];
}
int main() {
  scanf("%d%d", &n, &s);
  for (int i = (1); i <= (n); i++) {
    scanf("%d%d%d%d%d", &d[i].in, &d[i].out, &d[i].w, &d[i].s, &d[i].v);
  }
  d[0].in = -1;
  d[0].out = 3 * n;
  sort(d, d + n + 1);
  for (int i = (0); i <= (n); i++)
    for (int j = (0); j <= (s); j++) dp[i][j] = -1;
  for (int i = (0); i <= (n); i++) {
    nxt[i] = n + 1;
    for (int j = (i + 1); j <= (n); j++) {
      if (d[j].in >= d[i].out && nxt[i] == n + 1) nxt[i] = j;
    }
  }
  printf("%d\n", solve(0, s));
  return 0;
}
