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();
    }

    long func(long state)
    {
        auto アルゴリズムの合計 = new long[](m);
        long 合計金額;
        foreach (i; 0 .. n)
        {
            if ((state & (1 << i)) != 0)
            {
                合計金額 += 参考書の値段とアルゴリズム[i][0];
                foreach (j; 1 .. m + 1)
                {
                    アルゴリズムの合計[j - 1] += 参考書の値段とアルゴリズム[i][j];
                }
            }
        }
        foreach (k; 0 .. m)
        {
            if (アルゴリズムの合計[k] >= x)
            {
                continue;
            }
            else
            {
                return long.max;
            }
        }
        return 合計金額;
    }

    long ans = long.max;
    foreach (state; 0 .. 1 << n)
    {
        ans = min(func(state), ans);
    }
    if (ans == long.max)
    {
        writeln(-1);
        return;
    }
    writeln(ans);

}

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;
}
