#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<deque>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<stdlib.h>
using namespace std;
const long long mod=1000000007;
const long long inf=mod*mod;
const long long d2=500000004;
double dp[210][210];
int sz[210];
int S[210][210];
int H[210][210];
double h[210][210];
int main(){
	int a,b;scanf("%d%d",&a,&b);
	for(int i=0;i<a;i++){
		scanf("%d",sz+i);
		for(int j=0;j<sz[i];j++){
			scanf("%d%d",&S[i][j],&H[i][j]);
		}
	}
	for(int i=0;i<a;i++){
		for(int j=0;j<=b;j++){
			int now=j;
			for(int k=0;k<sz[i];k++){
				if(now<S[i][k]*H[i][k]){
					h[i][j]+=(double)now/S[i][k];
					now=0;
					break;
				}else{
					now-=S[i][k]*H[i][k];
					h[i][j]+=H[i][k];
				}
			}
			if(now){
				h[i][j]=-1;
			}
		}
	}
	for(int i=0;i<=a;i++)for(int j=0;j<=b;j++)dp[i][j]=-mod;
	dp[0][0]=0;
	for(int i=0;i<a;i++){
		for(int j=0;j<=b;j++){
			for(int k=0;j+k<=b;k++){
				if(h[i][k]<-0.5)continue;
				dp[i+1][j+k]=max(dp[i+1][j+k],dp[i][j]+h[i][k]);
			}
		}
	}
	double ret=0;
	for(int i=0;i<=b;i++)ret=max(ret,dp[a][i]);
	printf("%.12f\n",ret);
}