#include <string>
#include <iostream>
#include <stack>
#include <queue> // priority_queue も入ってる
#include <set>   // 要素数は size() で取得 multisetもある
#include <map>
#include <array> // sizeはコンパイル時定数で固定
#include <vector>
#include <numeric>   // accumulate, gcd
#include <algorithm> // count_ifに必要
#include <iomanip>   // cout << setprecision(15) << x で小数の出力精度を指定
#include <tuple>
#include <utility> //pair

using namespace std;
// 問題が起こるまでintは使用禁止2020-04-13
using ll = long long;

template <class InputIterator, class T>
bool contains_itr(InputIterator iterator, const T &value)
{
    if (find(iterator.begin(), iterator.end(), value) == iterator.end())
        return false;
    else
        return true;
}

template <class T>
bool contains_set(set<T> st, const T &value)
{
    if (st.find(value) == st.end())
    {
        return false;
    }
    else
    {
        return true;
    }
}

template <class InputIterator>
auto sum(InputIterator iterator)
{
    return accumulate(iterator.begin(), iterator.end(), 0);
}

// endは排他的(exclusive)なので注意
vector<ll> range(ll begin, ll end)
{
    vector<ll> result;
    for (ll i = begin; i < end; ++i)
    {
        result.push_back(i);
    }
    return result;
}

// =========ここまでテンプレ============

int main()
{
    ll n, m, x;
    cin >> n >> m >> x;
    vector<ll> cs;
    vector<vector<ll>> ass;
    for (ll i = 0; i < n; i++)
    {
        ll c;
        cin >> c;
        cs.push_back(c);
        vector<ll> as;
        for (ll j = 0; j < m; ++j)
        {
            ll a;
            cin >> a;
            as.push_back(a);
        }
        ass.push_back(as);
    }
    queue<vector<bool>> que;
    que.push(vector<bool>{false});
    que.push(vector<bool>{true});
    vector<vector<bool>> combis;
    while (que.size() != 0)
    {
        vector<bool> vec = que.front();
        que.pop();
        // ここnじゃん…
        if (vec.size() == n)
        {
            combis.push_back(vec);
        }
        else
        {
            // vector のコピー方法をちゃんと調べる
            vector<bool> vec2;
            vector<bool> vec3;
            for (bool b : vec)
            {
                vec2.push_back(b);
                vec3.push_back(b);
            }
            vec2.push_back(false);
            // ここがvec2になっててウン十分
            vec3.push_back(true);
            que.push(vec2);
            que.push(vec3);
        }
    }
    ll result = LLONG_MAX;
    // i 番目のコンビネーションの、j番目の本の、k番目のアルゴリズム
    for (ll i = 0; i < combis.size(); ++i)
    {
        vector<ll> understands(m, 0);
        for (ll j = 0; j < n; ++j)
        {
            if (combis[i][j])
            {
                for (ll k = 0; k < m; k++)
                {
                    understands[k] += ass[j][k];
                }
            }
        }
        bool ok = true;
        for (ll k = 0; k < m; ++k)
        {
            if (understands[k] < x)
            {
                ok = false;
            }
        }
        if (ok)
        {
            ll total = 0;
            for (ll j = 0; j < n; ++j)
            {
                if (combis[i][j])
                {
                    total += cs[j];
                }
            }
            result = min(result, total);
        }
    }
    if (result == LLONG_MAX)
    {
        cout << -1 << endl;
    }
    else
    {
        cout << result << endl;
    }
}

Measured memory_bytes: 3544