using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Diagnostics;
using static System.Console;
using Pair = System.Collections.Generic.KeyValuePair<int, int>;


class Program
{
    static void Main()
    {
        //SetOut(new StreamWriter(OpenStandardOutput()) { AutoFlush = false });
        new Program().Solve();
        //Out.Flush();
    }
    Scanner cin = new Scanner();
    readonly int[] dd = { 0, 1, 0, -1, 0 };
    readonly int mod = 1000000007;
    readonly string alfa = "abcdefghijklmnopqrstuvwxyz";

    /*class K
    {
        int a, b, c;
        public K(int d, int e, int f)
        {
            a = d;
            b = e;
            c = f;
        }
    }*/


    //半分全列挙
    void Solve()
    {
        int N = cin.Nextint;
        int M = cin.Nextint;
        int L = cin.Nextint;
        var A = new int[N];
        var B = new int[N];
        var C = new int[N];
        for (int i = 0; i < N; i++)
        {
            var T = cin.Scanint;
            A[i] = T[0];
            B[i] = T[1];
            C[i] = T[2];
        }
        int z = N / 2;

        var G = new Dictionary<int, int>();//Keyは負の可能性があるので。
        int ans = int.MaxValue;
        for (int i = 0; i < 1 << z; i++)
        {
            int aa = 0, bb = 0, cc = 0;
            for (int j = 0; j < z; j++)
            {
                if ((i >> j & 1) == 1)
                {
                    aa += A[j];
                    bb += B[j];
                    cc += C[j];
                }
            }
            int y = bb * M - aa * L;
            if (y == 0 && cc != 0) ans = Math.Min(ans, cc);
            if (G.ContainsKey(y))
            {
                G[y] = Math.Min(G[y], cc);
                
            }
            else
            {
                G[y] = cc;
            }
        }


        for (int i = 0; i < 1 << (N - z); i++)
        {
            int aa = 0, bb = 0, cc = 0;
            for (int j = 0; j < N - z; j++)
            {
                if ((i >> j & 1) == 1)
                {
                    aa += A[j + z];
                    bb += B[j + z];
                    cc += C[j + z];
                }
            }
            int y = L * aa - M * bb;
            if(y == 0 && cc!= 0) ans = Math.Min(ans, cc);
            if (G.ContainsKey(y))
            {
                int cost = G[y] + cc;
                if (cost != 0)
                {
                    ans = Math.Min(cost, ans);
                }
            }
        }
        if (ans == int.MaxValue)
        {
            WriteLine(-1);
            return;
        }
        WriteLine(ans);
    }

}

class Scanner
{
    string[] s; int i;
    char[] cs = new char[] { ' ' };
    public Scanner() { s = new string[0]; i = 0; }
    public string[] Scan { get { return ReadLine().Split(); } }
    public int[] Scanint { get { return Array.ConvertAll(Scan, int.Parse); } }
    public long[] Scanlong { get { return Array.ConvertAll(Scan, long.Parse); } }
    public double[] Scandouble { get { return Array.ConvertAll(Scan, double.Parse); } }
    public string Next
    {
        get
        {
            if (i < s.Length) return s[i++];
            string st = ReadLine();
            while (st == "") st = ReadLine();
            s = st.Split(cs, StringSplitOptions.RemoveEmptyEntries);
            i = 0;
            return Next;
        }
    }
    public int Nextint { get { return int.Parse(Next); } }
    public long Nextlong { get { return long.Parse(Next); } }
    public double Nextdouble { get { return double.Parse(Next); } }
}

Measured memory_bytes: 13140