#include using namespace std; using f128 = __float128; int main() { int n, k; cin >> n >> k; vector p(n), s(n), t(n); for(int i = 0; i < n; i++) cin >> p[i] >> s[i] >> t[i]; vector prodp(n+1); prodp[0] = 1; for(int i = 0; i < n; i++) prodp[i+1] = prodp[i] * (p[i] + 1); auto idx_encode = [&](vector data) { int idx = 0; for(int i = 0; i < n; i++) { idx *= p[i] + 1; idx += data[i]; } return idx; }; auto idx_decode = [&](int idx) { vector data(n); for(int i = n-1; i >= 0; i--) { data[i] = idx % (p[i] + 1); idx /= p[i] + 1; } return data; }; bool winable = false; vector win(1<> j & 1) tmp += t[j]; else tmp += s[j]; } if(tmp <= 60) { win[i] = 1; winable = true; } } if(!winable) { cout << "-1\n"; return 0; } vector mx(prodp[n]), mn(prodp[n], 1e9); vector ex(prodp[n]); for(int i = (prodp[n])-1; i >= 0; i--) { vector data = idx_decode(i); int numcases = 0; int numselfcases = 0; f128 sumsteps = 0; for(int j = 0; j < 1< ndata = data; for(int l = 0; l < n; l++) { if(j >> l & 1) cases *= max(0, data[l] - k); else { cases *= p[l] - data[l]; ndata[l]++; } } if(cases == 0) continue; int ni = idx_encode(ndata); numcases += cases; sumsteps += cases; if(win[j]) { mn[i] = min(mn[i], 1); mx[i] = max(mx[i], 1); } else if(ni == i) { numselfcases += cases; } else { sumsteps += cases * ex[ni]; mn[i] = min(mn[i], mn[ni] + 1); mx[i] = max(mx[i], mx[ni] + 1); } } ex[i] = sumsteps / (numcases - numselfcases); } cout << fixed << setprecision(20); cout << mn[0] << " " << mx[0] << " " << (double)ex[0] << '\n'; }