#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


#define NUM 2002

enum Type{
	VISUAL,
	DANCE,
	VOCAL,
};

struct Info{
	int point[3];
};

int vonus_point[3] = {5,3,2};
Info info[NUM];
double dp_allocate[NUM][NUM],dp_appeal_num[NUM];
double dp_exp[3][NUM];

int main(){

	int N,M;
	scanf("%d %d",&N,&M);

	for(int i = 0; i < N; i++){
		scanf("%d %d %d",&info[i].point[VISUAL],&info[i].point[DANCE],&info[i].point[VOCAL]);
	}

	for(int i = 0; i <= M; i++){
		for(int k = 0; k <= M; k++)dp_allocate[i][k] = 0;
	}

	int self = 0;

	dp_allocate[0][0] = 1;

	for(int count = 1; count <= M; count++){
		for(int vi = 0; vi <= count-1; vi++){
			dp_allocate[count][vi+1] += dp_allocate[count-1][vi]/3.0;
			dp_allocate[count][vi] += dp_allocate[count-1][vi]*2.0/3.0;
		}
	}

	double tmp = 0;
	for(int num = M; num >= 0; num--){
		tmp += dp_allocate[M][num];
		dp_appeal_num[num] = tmp;
	}

	for(int junle = 0; junle <= 2; junle++){
		for(int count = 0; count <= M; count++)dp_exp[junle][count] = 0;
	}

	double rank_1,rank_2,rank_3,rank_lowest,upper_probability;
	int self_point,enemy_point,need_count;

	for(int junle = 0; junle <= 2; junle++){
		for(int count = 0; count <= M; count++){

			rank_1 = 1.0,rank_2 = 0.0,rank_3 = 0.0,rank_lowest = 1.0;

			self_point = info[self].point[junle]*count;

			for(int i = 1; i < N; i++){

				enemy_point = info[i].point[junle];

				if(self_point%enemy_point == 0){
					need_count = self_point/enemy_point;
				}else{
					need_count = self_point/enemy_point+1;
				}

				if(need_count > M){
					upper_probability = 0;
				}else{
					upper_probability = dp_appeal_num[need_count];
				}

				rank_3 = rank_2*upper_probability+rank_3*(1-upper_probability);
				rank_2 = rank_1*upper_probability+rank_2*(1-upper_probability);
				rank_1 *= (1-upper_probability);
				rank_lowest *= upper_probability;
			}

			dp_exp[junle][count] = (rank_1+rank_2+rank_3)*vonus_point[junle]-rank_lowest;
		}
	}

	double ans = -DBL_MAX;

	int vo;
	for(int vi = 0; vi <= M; vi++){
		for(int da = 0; vi+da <= M; da++){
			vo = M-(vi+da);

			ans = max(ans,dp_exp[VISUAL][vi]+dp_exp[DANCE][da]+dp_exp[VOCAL][vo]);
		}
	}

	printf("%.12lf\n",ans);

    return 0;
}

