unittest
{
	assert( [ "2 3", "10 1", "1", "15 1", "2", "30 2", "1 2" ].parse.expand.solve == 25 );
	assert( [ "12 1", "100000 1", "2" ].parse.expand.solve == -1 );
	assert( [ "4 6", "67786 3", "1 3 4", "3497 1", "2", "44908 3", "2 3 4", "2156 3", "2 3 4", "26230 1", "2", "86918 1", "3" ].parse.expand.solve == 69942 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nm = input.front.split.to!( long[] );
	auto acs = new Tuple!( long, long )[ nm[ 1 ] ];
	foreach( ref ac; acs )
	{
		input.popFront;
		auto ab = input.front.split.to!( long[] );
		input.popFront;
		auto cs = input.front.split.to!( long[] );
		ac = tuple( ab[ 0 ], cs.toBits );
	}
	return tuple( nm[ 0 ], acs );
}

auto solve( long n, Tuple!( long, long )[] acs )
{
	// dp[ i個目の鍵 ][ 対応する宝箱（bit列） ] = 最小コスト
	auto dp = new long[][]( 1 + acs.length, 1L << n );
	foreach( ref dpp; dp )
	{
		dpp[] = long.max;
	}
	dp[ 0 ][ 0 ] = 0L;
	
	foreach( i, ac; acs )
	{
		for( auto b = 0L; b < dp[ i ].length; b++ )
		{
			if( dp[ i ][ b ] == long.max ) continue;
			dp[ i + 1 ][ b           ] = min( dp[ i + 1 ][ b           ], dp[ i ][ b ]           );		// 買わない場合
			dp[ i + 1 ][ b | ac[ 1 ] ] = min( dp[ i + 1 ][ b | ac[ 1 ] ], dp[ i ][ b ] + ac[ 0 ] );		// 買う場合
		}
	}
	
	if( dp[ $ - 1 ][ $ - 1 ] == long.max ) return -1;
	else                                   return dp[ $ - 1 ][ $ - 1 ];
}

// 整数列をビットパターンに変換（整数は1～32限定）
auto toBits( long[] ns )
{
	auto b = 0U;
	foreach( n; ns ) b |= 1 << ( n - 1 );
	return b;
}
