#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <utility>
#define MAX 110
#define INF 1000000000000000000LL

using namespace std;

typedef long long ll;
typedef pair < int, int > pii;

int k[MAX];
int y[MAX];
vector < pii > v[MAX];
int n;
ll T;

struct Matrix {
	ll mat[MAX][MAX];
	
	void StepZero( void ) {
		for ( int i = 0; i < MAX; ++i )
			for ( int j = 0; j < MAX; ++j )
				mat[i][j] = i == j ? 0 : INF;
	}
};

Matrix current, step, step_copy, start_matrix;

void apply_matrix( Matrix &a, const Matrix &b ) {
	for ( int i = 1; i <= n; ++i )
		for ( int j = 1; j <= n; ++j ) {
			ll best = INF;
			for ( int k = 1; k <= n; ++k )
				best = min( best, a.mat[i][k] + y[k] + b.mat[k][j] );
				
			if ( best > INF ) best = INF;
			a.mat[i][j] = best;
		}
}

bool moze( ll target ) {
	current.StepZero();
	step = start_matrix;
	for ( ;; ) {
		if ( target & 1 )
			apply_matrix( current, step );
			
		target >>= 1;
		if ( target == 0 ) break;
		step_copy = step;
		apply_matrix( step, step_copy );
	}
	
/*	printf("\n");
	for ( int i = 1; i <= n; ++i ) {
		for ( int j = 1; j <= n; ++j )
			printf("%I64d ", current.mat[i][j] == INF ? -1 : current.mat[i][j]);
		printf("\n");
	} //*/

	for ( int i = 1; i <= n; ++i ) {
		for ( int j = 1; j <= n; ++j )
			if ( current.mat[i][j]/* - y[j]*/ <= T )
				return true;
//		int best = *min_element( current.mat[i] + 1 , current.mat[i] + n + 1 );
//		if ( best - y[i] <= T ) return true;
	}
	return false;
}



int main(void) {
	for ( int i = 0; i < MAX; ++i )	
		for ( int j = 0; j < MAX; ++j )
			start_matrix.mat[i][j] = INF;

	scanf("%d%lld", &n, &T);
	for ( int i = 1; i <= n; ++i ) {
		scanf("%d%d", k + i, y + i);
		
		v[i].resize( k[i] );
		for ( int j = 0; j < k[i]; ++j )
			scanf("%d", &v[i][j].first);
		for ( int j = 0; j < k[i]; ++j )
			scanf("%d", &v[i][j].second);
			
	}

	for ( int i = 1; i <= n; ++i ) {
		for ( int j = 0; j < k[i]; ++j ) {
			int x = v[i][j].first;
			start_matrix.mat[i][x] = min( start_matrix.mat[i][x], (ll)v[i][j].second /*+ y[x]*/ );
		}
	}
	
/*	for ( int i = 1; i <= n; ++i ) {
		for ( int j = 1; j <= n; ++j )
			printf("%I64d ", start_matrix.mat[i][j] == INF ? -1 : start_matrix.mat[i][j]);
		printf("\n");
	} 
	printf("\n");//*/
	
	
	
	
	ll low, middle, high;
	low = 0;
	high = T;
	while ( low < high ) {
		middle = ( low + high + 1 ) / 2;
		int tmp = moze( middle );
//		printf("%I64d %I64d %I64d %d\n", low, middle, high, tmp); 
		if ( tmp )
			low = middle;
		else
			high = middle - 1;
	}
	printf("%lld\n", low);
	
	return 0;
}
