unittest
{
	assert( [ "3 1 1", "1 2 1", "2 1 2", "3 3 10" ].parse.expand.solve == 3 );
	assert( [ "1 1 10", "10 10 10" ].parse.expand.solve == -1 );
}



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 nmm = input.front.split.to!( long[] );
	auto abcs = new long[ 3 ][ nmm[ 0 ] ];
	foreach( ref abc; abcs )
	{
		input.popFront;
		abc = input.front.split.to!( long[] );
	}
	return tuple( nmm[ 1 ], nmm[ 2 ], abcs );
}

auto solve( long ma, long mb, long[ 3 ][] abcs )
{
	// 混合比が条件を満たしているもののうち、最小コストを検索
	auto dp = new long[][]( 1 + abcs.length * 10, 1 + abcs.length * 10 );
	foreach( ref x; dp ) x[] = long.max;
	dp[ 0 ][ 0 ] = 0L;
	foreach( abc; abcs )
	{
		for( auto a = abc[ 0 ]; a < dp.length; a++ )
		{
			for( auto b = abc[ 1 ]; b < dp[ a ].length; b++ )
			{
				if( dp[ a - abc[ 0 ] ][ b - abc[ 1 ] ] == long.max ) continue;
				dp[ a ][ b ] = min( dp[ a ][ b ], dp[ a - abc[ 0 ] ][ b - abc[ 1 ] ] + abc[ 2 ] );
			}
		}
	}
	
	// 混合比が条件を満たしているもののうち、最小コストを検索
	auto ans = long.max;
	for( auto a = ma, b = mb; a < dp.length && b < dp[ a ].length; a += ma, b += mb )
	{
		ans = min( ans, dp[ a ][ b ] );
	}
	if( ans == long.max ) return -1;
	else                  return ans;
}
