#include <bits/stdc++.h>
using namespace std;
struct Problem {
  long long as, at, bs, bt;
  double pr;
} a[2000];
const long long P = (long long)1e6;
int n, m;
long long fail[1001];
long long f[1001][1600];
double g[1001][1600];
bool cmp(Problem u, Problem v) {
  return u.bt * u.pr * (1 - v.pr) < v.bt * v.pr * (1 - u.pr);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
    scanf("%I64d%I64d%I64d%I64d%lf", &a[i].as, &a[i].bs, &a[i].at, &a[i].bt,
          &a[i].pr);
  sort(a + 1, a + n + 1, cmp);
  for (int i = 1; i <= n; i++) fail[i] = (long long)(a[i].pr * P + 0.5);
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= m; j++) f[i][j] = -1;
  f[0][0] = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j <= m; j++)
      if (f[i][j] != -1) {
        int t = i + 1;
        if (f[i + 1][j] < f[i][j] ||
            (f[i + 1][j] == f[i][j] && g[i + 1][j] > g[i][j])) {
          f[i + 1][j] = f[i][j];
          g[i + 1][j] = g[i][j];
        }
        if (j + a[t].at <= m) {
          long long t1 = f[i][j] + a[t].as * P;
          double p1 = g[i][j] + a[t].at;
          int j1 = j + a[t].at;
          if (f[i + 1][j1] < t1 || (f[i + 1][j1] == t1 && g[i + 1][j1] > p1)) {
            f[i + 1][j1] = t1;
            g[i + 1][j1] = p1;
          }
        }
        if (j + a[t].at + a[t].bt <= m) {
          long long t1 = f[i][j] + a[t].as * P + a[t].bs * (P - fail[t]);
          double p1 =
              g[i][j] * a[t].pr + a[t].at + (j + a[t].bt) * (1 - a[t].pr);
          int j1 = j + a[t].at + a[t].bt;
          if (f[i + 1][j1] < t1 || (f[i + 1][j1] == t1 && g[i + 1][j1] > p1)) {
            f[i + 1][j1] = t1;
            g[i + 1][j1] = p1;
          }
        }
      }
  long long ans1 = -1;
  double ans2 = 0;
  for (int i = 0; i <= m; i++)
    if (ans1 < f[n][i] || (ans1 == f[n][i] && g[n][i] < ans2))
      ans1 = f[n][i], ans2 = g[n][i];
  printf("%.9lf %.9lf\n", (double)ans1 / (double)P, ans2);
  return 0;
}
