#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
using namespace std;
// using namespace __gnu_pbds;
#define ll long long int
#define ld long double
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define mk make_pair
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define fs first
#define sc second 
#define mod 1000000007ll
#define sp <<" "<<
#define JOKER ios_base::sync_with_stdio (false) ; cin.tie(0) ; cout.tie(0) ;
// typedef tree<lli, null_type, less_equal<lli>, rb_tree_tag, tree_order_statistics_node_update> ordered_multiset;

// int spf[10000001];
// ll fac[200005];
// ll comb[1010][1010];
// const ll MAXN=1e6+5;
// ll tree[MAXN];
// void inc(ll pos);
// ll get(ll pos);
// ll get_kth(ll k);
// void combfun();
// void sieve(int n);
// ll expo(ll base,ll exponent);
// ll power(ll x, ll y, ll p);
// ll modInverse(ll n, ll p);
// ll nCrModPFormat(ll n, ll r, ll p);


int n,m,x;
int cost[13];
int a[13][13];
int ans=INT_MAX;
void fn(vector<int>v,int idx)
{
    int temp=0;
    int arr[m]={};
    for(auto i:v)
    {
        temp+=cost[i];
        for(int j=0; j<m; j++)
        {
            arr[j]+=a[i][j];
        }
    }
    int f=0;
    for(int i=0; i<m; i++)
    {
        if(arr[i]>=x)
            continue;
        else 
        {
            f=1;
            break;
        }
    }
    if(!f)
        ans=min(temp,ans);
    if(idx>=n-1)
        return;
    fn(v,idx+1);
    v.pb(idx+1);
    fn(v,idx+1);
}
main()  
{
    JOKER
    int t=1; 
    // cin>>t;
    while(t--)
    {
        cin>>n>>m>>x;
        for(int i=0; i<n; i++)
        {
            cin>>cost[i];
            for(int j=0; j<m; j++)
                cin>>a[i][j];
        }
        vector<int>v;
        fn(v,0);
        v.pb(0);
        fn(v,0);
        if(ans==INT_MAX)
            cout<<"-1";
        else cout<<ans;
    }
    cerr<<"Time elapsed : "<<clock()*1000.0/CLOCKS_PER_SEC<<"ms"<<'\n'; 
    return 0;
}

// void combfun()
// {
//     for(int i=1; i<1010; i++)
//     {
//         for(int j=0; j<=i; j++)
//         {
//             if(j==0 or i==j)
//             {
//                 comb[i][j]=1;
//             }
//             else 
//             {
//                 comb[i][j]=comb[i-1][j]+comb[i-1][j-1];
//                 comb[i][j]%=mod;
//             }
//         }
//     }
// }

// ll expo(ll base,ll exponent)
// {
//     ll ans=1ll;
//     while(exponent!=0ll){
//         if(exponent&1ll)ans=(ans*base)%mod;
//         base=(base*base)%mod;
//         exponent>>=1ll;
//     }
//     return ans%mod;
// }

// void sieve(int n)
// {
//     spf[1]=1;
//     for(int i=2;i<=n;i++) spf[i]=i;
//     for(int i=4;i<=n;i+=2) spf[i]=2;
//     for(int i=3;i*i<=n;i++)
//     {
//         if(spf[i]==i)
//         {
//             for(int j=i*i;j<=n;j+=i)
//             {
//                 if(spf[j]==j) spf[j]=i;
//             }
//         }
//     }
// }

// ll power(ll x, ll y, ll p) 
// { 
//     ll res = 1;
//     x = x % p;
//     while (y > 0) 
//     { 
//         if (y & 1) 
//             res = (res*x) % p; 
//         y = y>>1;
//         x = (x*x) % p; 
//     } 
//     return res; 
// }

// void inc(ll pos) {
//     for (; pos < MAXN; pos |= (pos + 1)) {
//         tree[pos] += 1;
//     }
// }
 
// ll get(ll pos) {
//     ll ans = 0;
//     for (; pos >= 0; pos = (pos & (pos + 1)) - 1) {
//         ans += tree[pos];
//     }
//     return ans;
// }

// ll get_kth(ll k) {
//     ll l = -1, r = MAXN;
//     while (r - l > 1) {
//         ll mid = (l + r) / 2;
//         if (get(mid) < k) {
//             l = mid;
//         } else {
//             r = mid;
//         }
//     }
//     return r;
// }

// ll modInverse(ll n, ll p) 
// { 
//     return power(n, p-2, p); 
// } 

// ll nCrModPFormat(ll n, ll r, ll p) 
// {
//     if (r==0) 
//         return 1; 
//     return (fac[n]* modInverse(fac[r], p) % p * modInverse(fac[n-r], p) % p) % p; 
// }

Measured memory_bytes: 3856