#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1086;
const int MAXT = 1586;
const long long R = 1000000;
struct query {
  long long ts, tl;
  long double ss, sl, p;
  query() {}
  query(long double _ss, long double _sl, long long _ts, long long _tl,
        long double _p)
      : ss(_ss), sl(_sl), ts(_ts), tl(_tl), p(_p) {}
  void init() {
    cin >> ss >> sl >> ts >> tl >> p;
    ss *= R, sl *= R;
  }
} Q[MAXN];
pair<long double, long double> dp[MAXN][MAXT];
inline bool cmp(const query &a, const query &b) {
  return a.tl * (1 - b.p) * a.p < b.tl * (1 - a.p) * b.p;
}
void update(pair<long double, long double> &a,
            pair<long double, long double> b) {
  if (b.first > a.first || a.first == b.first && a.second > b.second) a = b;
}
int main() {
  int i, j;
  int m, n;
  scanf("%d%d", &n, &m);
  for (i = 0; i < n; ++i) Q[i].init();
  sort(Q, Q + n, cmp);
  for (i = 0; i < n; ++i)
    for (j = 0; j <= m; ++j) dp[i][j].first = dp[i][j].second = -1;
  dp[0][0].first = dp[0][0].second = 0;
  for (i = 0; i < n; ++i) {
    long long ts = Q[i].ts, tl = Q[i].tl;
    long double ss = Q[i].ss, sl = Q[i].sl, p = Q[i].p;
    for (j = 0; j <= m; ++j)
      if (dp[i][j].first != -1) {
        long double cs = dp[i][j].first, cp = dp[i][j].second;
        update(dp[i + 1][j], dp[i][j]);
        if (j + ts <= m)
          update(dp[i + 1][j + ts],
                 pair<long double, long double>(cs + ss, cp + ts));
        if (j + ts + tl <= m)
          update(dp[i + 1][j + ts + tl],
                 pair<long double, long double>(
                     cs + ss + (1 - p) * sl, ts + (j + tl) * (1 - p) + p * cp));
      }
  }
  pair<long double, long double> res(0, 0);
  for (i = 0; i <= m; ++i) update(res, dp[n][i]);
  cout << setprecision(20) << res.first / R << ' ' << res.second << endl;
  return 0;
}
