using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "InputX";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("3 1 1");
            WillReturn.Add("1 2 1");
            WillReturn.Add("2 1 2");
            WillReturn.Add("3 3 10");
            //3
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("1 1 10");
            WillReturn.Add("10 10 10");
            //-1
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    struct YakuhinInfoDef
    {
        internal int A;
        internal int B;
        internal int C;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        int[] wkArr = { };
        Action<string> SplitAct = pStr =>
            wkArr = pStr.Split(' ').Select(X => int.Parse(X)).ToArray();

        SplitAct(InputList[0]);
        int MA = wkArr[1];
        int MB = wkArr[2];

        var YakuhinInfoList = new List<YakuhinInfoDef>();
        foreach (string EachStr in InputList.Skip(1)) {
            SplitAct(EachStr);
            YakuhinInfoDef WillAdd;
            WillAdd.A = wkArr[0];
            WillAdd.B = wkArr[1];
            WillAdd.C = wkArr[2];
            YakuhinInfoList.Add(WillAdd);
        }

        //最小金額[タイプAの合計,タイプBの合計]なDP表
        var PrevDP = new Dictionary<string, int>();
        PrevDP["0,0"] = 0;

        foreach (YakuhinInfoDef EachYakuhin in YakuhinInfoList) {
            var CurrDP = new Dictionary<string, int>(PrevDP);
            foreach (var EachPair in PrevDP) {
                string[] wkStr = EachPair.Key.Split(',');
                int CurrA = int.Parse(wkStr[0]);
                int CurrB = int.Parse(wkStr[1]);

                int NewA = CurrA + EachYakuhin.A;
                int NewB = CurrB + EachYakuhin.B;
                int NewC = EachPair.Value + EachYakuhin.C;

                string NewKey = string.Format("{0},{1}", NewA, NewB);
                if (CurrDP.ContainsKey(NewKey)) {
                    if (CurrDP[NewKey] > NewC)
                        CurrDP[NewKey] = NewC;
                }
                else CurrDP[NewKey] = NewC;
            }
            PrevDP = CurrDP;

            //foreach (string EachKey in DPDict.Keys.ToArray()) {
            //    string[] wkStr = EachKey.Split(',');
            //    int CurrA = int.Parse(wkStr[0]);
            //    int CurrB = int.Parse(wkStr[1]);

            //    int NewA = CurrA + EachYakuhin.A;
            //    int NewB = CurrB + EachYakuhin.B;
            //    int NewC = DPDict[EachKey] + EachYakuhin.C;

            //    string NewKey = string.Format("{0},{1}", NewA, NewB);
            //    if (DPDict.ContainsKey(NewKey)) {
            //        if (DPDict[NewKey] > NewC)
            //            DPDict[NewKey] = NewC;
            //    }
            //    else DPDict[NewKey] = NewC;
            //}
        }

        int Answer = int.MaxValue;
        bool HasAnswer = false;

        foreach (var EachPair in PrevDP) {
            string[] wkStr = EachPair.Key.Split(',');
            int CurrA = int.Parse(wkStr[0]);
            int CurrB = int.Parse(wkStr[1]);

            for (int I = 1; I < int.MaxValue; I++) {
                if (MA * I > CurrA) break;
                if (MB * I > CurrB) break;

                if (MA * I != CurrA) continue;
                if (MB * I != CurrB) continue;

                HasAnswer = true;
                if (Answer > EachPair.Value) {
                    Answer = EachPair.Value;
                }
            }
        }
        Console.WriteLine(HasAnswer ? Answer : -1);
    }
}


Measured memory_bytes: 22920