import std;

alias sread = () => readln.chomp();
alias lread = () => readln.chomp.to!long();
alias aryread(T = long) = () => readln.split.to!(T[]);
//aryread!string();
//auto PS = new Tuple!(long,string)[](M);
//x[]=1;でlong[]全要素1に初期化
void main()
{
    long n, m, x;
    scan(n, m, x);
    auto 参考書の値段とアルゴリズム = new long[][](n);
    // writeln(tmp);
    foreach (i; 0 .. n)
    {
        参考書の値段とアルゴリズム[i] = aryread();
    }
    // writeln(tmp);

    long func(long[] 買う買わない)
    {
        long 合計金額;
        auto 理解度 = new long[](m);
        if (買う買わない.length == n)
        {
            foreach (i; 0 .. (買う買わない.length))
            {
                if (買う買わない[i] == 1)
                {

                    合計金額 += 参考書の値段とアルゴリズム[i][0];
                    foreach (アルゴリズム番号; 1 .. m + 1)
                    {
                        理解度[アルゴリズム番号 - 1] += 参考書の値段とアルゴリズム[i][アルゴリズム番号];
                    }
                }
            }
            foreach (i; 0 .. m)
            {
                if (理解度[i] >= x)
                {
                    continue;
                }
                else
                {
                    return -1;
                }
            }
            return 合計金額;
        }
        else
        {
            // func(a~0);
            // func(a~1);
            long func_0 = func(買う買わない ~ 0);
            long func_1 = func(買う買わない ~ 1);
            if (func_0 != -1 && func_1 != -1)
            {
                return min(func_0, func_1);
            }
            else if (func_0 == -1 && func_1 != -1)
            {
                return func_1;
            }
            else if (func_1 == -1 && func_0 != -1)
            {
                return func_0;
            }
            else
            {

                return -1;
            }

        }
    }

    func([]).writeln();

    // func([1,1,0])
    // func([1,1,1])
    // long func(long[] a);
    // func([]);
    // func([1]);
    // func([0]);
    // func([1,0]);
    // func([1,1]);

    // xxx  func(xxx) = min(func(1xx), func(0xx))
    // 1xx

    // 11x
    // 111
    // 110

    // 10x
    // 101
    // 100

    // writeln(func(tmp, x));

}

void scan(L...)(ref L A)
{
    auto l = readln.split;
    foreach (i, T; L)
    {
        A[i] = l[i].to!T;
    }
}

void arywrite(T)(T a)
{
    a.map!text.join(' ').writeln;
}
