#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
 #define int long long

#define all(X) (X).begin(), (X).end()
#define reset(X) memset(X, 0, sizeof(X))
#define mp(a, b) make_pair(a, b)
#define pb push_back
#define endl '\n'
#define fi first
#define se second



using namespace __gnu_pbds;
using namespace std;
const int mod=1e9+7;
 // const int mod=998244353;
 // const int mod=1e9+9;
const int INF=4e18+10;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define read(n) int n; cin>>n;
#define readv(x, n) vector<int> x(n); for(auto &i:x) cin>>i; 
int multiply(int a, int b, int in_mod){return (a*b)%in_mod;} 
int mult_identity(int a){return 1;}


auto power(auto a, int b, int in_mod)
{
    auto prod=mult_identity(a);
    auto mult=a%in_mod;
    while(b!=0)
    {
        if(b%2)
        {
            prod=multiply(prod,mult, in_mod);

        }
        mult=multiply(mult, mult,in_mod);
        b/=2;
    }
    return prod;
}
int mod_inv(int q, int in_mod)
{

    return power(q, in_mod-2,in_mod);
}




const int MAXN=2e1+100;
vector<int> adj[MAXN];
map<pair<pair<int, int>, int>  , int> cnt; 
int ans =0;
int k;
int n, m;
vector<vector<int> > a(MAXN, vector<int> (MAXN));
void dfs(int x, int y,int left, int xo=0)
{
    xo = xo^(a[x][y]);
    if(left==0)
    {
        cnt[{{x,y}, xo }]++;
        return;
    }
    if(x!=n-1)
        dfs(x+1, y, left-1, xo);
    if(y!=m-1)
        dfs(x, y+1, left-1, xo);
}


void dfs2(int x, int y,int left, int xo=0)
{
    xo = xo^(a[x][y]);

    if(left==0)
    {
        ans += cnt[{{x,y}, xo^k^a[x][y]}];
        return;
    }
    if(x!=0)
        dfs2(x-1, y, left-1, xo);
    if(y!=0)
        dfs2(x, y-1, left-1, xo);
}



void solve()
{ 
    int n, m, x;
    cin>>n>>m>>x;
    vector<int> c(n);
    vector<vector<int> > good_boys(n, vector<int>(m));
    for(int i=0;i<n;i++)
    {
        cin>>c[i];
        for(int j=0;j<m;j++)
        {
            cin>>good_boys[i][j];
        }
    }
    int mn=INF;

    for(int i=0;i<(1<<n);i++)
    {
        int sm=0;
        vector<int> qualites(m);
        for(int j=0;(1<<j)<=(i);j++)
        {
            if(i&(1<<j))
            {
                sm+=c[j];
                for(int k=0;k<m;k++)
                {
                    qualites[k]+=good_boys[j][k];
                }
            }
        }
        bool flag=false;
        for(auto i:qualites)
        {
            if(i<x)
                flag=true;
        }
        if(flag==false)
        {
            mn=min(mn, sm);
        }
    }
    if(mn==INF)
        mn=-1;
    cout<<mn<<endl;

}

signed main()

{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);  
    cout.tie(NULL);
    #ifndef ONLINE_JUDGE
    if(fopen("INPUT.txt","r"))
    {
        freopen ("INPUT.txt" , "r" , stdin);
        freopen ("OUTPUT.txt" , "w" , stdout);
    }
    #endif
    auto clk=clock(); 
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    // -------------------------------------Code starts here---------------------------------------------------------------------     

    int t=1;
    // cin>>t;
    for(int test=1;test<=t;test++)
    {
        // cout<<"Case #"<<test<<": ";
        solve();
        // cout<<endl;

    }

    // -------------------------------------Code ends here------------------------------------------------------------------


    clk = clock() - clk;
    cerr << fixed << setprecision(6) << "Time: " << ((double)clk)/CLOCKS_PER_SEC << "\n";
    return 0;
}


Measured memory_bytes: 3928