#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp> 
// #include <ext/pb_ds/tree_policy.hpp> 
// #include <ext/pb_ds/detail/standard_policies.hpp>
// using namespace __gnu_pdbs;
using namespace std;

// typedef tree<int, null_type, less<int>, rb_tree_tag,  
//             tree_order_statistics_node_update>  
//     ordered_set;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pop_b pop_back
#define pf push_front
#define pop_f pop_front
#define mt make_tuple
#define eb emplace_back
#define sf(x) sizeof(x)
#define len(x) x.length()
#define sz(x) x.size()
#define fastio() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)

#define LB(x,v) (lower_bound(x.begin(),x.end(),v)-x.begin())
#define UB(x,v) (upper_bound(x.begin(),x.end(),v)-x.begin())
typedef long long ll;
typedef pair<ll,ll> ii;
typedef long double ld; 
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<ld> vd;
typedef deque<ll> dql;
typedef deque<int> dqi;
typedef unsigned long long ull;
typedef tuple<int,int,int> State;

#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
	cerr << *it << " = " << a << endl;
	err(++it, args...);
}
#define vmax(type)   std::numeric_limits<type>::max()
#define vmin(type)   std::numeric_limits<type>::min()
#define citc(tc) int tc; cin>>tc; while(tc--) 
#define each(a,x) for( auto &a:(x))
#define rep(i, n) for (ll i = 0; i < (n); i++)
#define repr(i, n) for (ll i = (n) - 1; i >= 0; i--)
#define rep2(i, l, r) for (ll i = (l); i < (r); i++)
#define rep2r(i, l, r) for (ll i = (r) - 1; i >= (l); i--)
#define range(a) a.begin(), a.end()
#define deb(x) cout<<#x<<" "<<x<<endl;
#define cini(i) int i; cin>>i;
#define cinll(l) ll l; cin>>l;
#define cinll2(l, z) ll l, z; cin>>l>>z;
#define cinll3(l, z, x) ll l, z, x; cin>>l>>z>>x;
#define cinai(a, n) vi a(n); rep(i, n) { cin>>a[i]; }
#define cinal(a, n) vl a(n); rep(i, n) { cin>>a[i]; }
#define coutai(a, n) rep(i, n) { cout<<a[i]<<" "; } ent;
#define coutal(a, n) rep(i, n) { cout<<a[i]<<" "; } ent;
#define ent cout<<endl;
#define resize_vec(a) a.resize(unique(a.begin(), a.end()) - a.begin());
#define ms(dp, x) memset(dp, x, sf(dp))


// const long long MAX_SIZE = 1000000; 
// vector<long long >isprime(MAX_SIZE , true); 
// vector<long long >prime; 
// vector<long long >SPF(MAX_SIZE); 
  
// // function generate all prime number less then N in O(n) 
// void manipulated_seive(ll N) 
// { 
//     isprime[0] = isprime[1] = false ;  
//     for (ll i=2; i<N ; i++) 
//     {  
//         if (isprime[i]) 
//         { 
//             prime.push_back(i); 
//             SPF[i] = i; 
//         } 
//         for (ll j=0;j < prime.size() && i*prime[j] < N && prime[j] <= SPF[i];j++) 
//         { 
//             isprime[i*prime[j]]=false; 
//             SPF[i*prime[j]] = prime[j] ; 
//         } 
//     } 
// } 

ll mod = 1e9 + 7;

ll powm(ll a, ll b, ll mod) {
	ll res=1;
	while(b) {
		if(b&1)
			res=(res*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return res;
}
bool sortinrev(const pair<int,int> &a, const pair<int,int> &b) 
{ 
       return (a.first > b.first); 
} 

int main()
{
	fastio();	
	int n, x, m;
	cin>>n>>m>>x;
	int c[n], a[n][m];
	rep(i, n)
	{
		cin>>c[i];
		rep(j, m)
			cin>>a[i][j];
	} 
	int st = 1<<(n), ans = INT_MAX;
	rep2(i, 1, st)
	{
		int temp[m] = {0}, temp_ans = 0;
		rep(j, n)
		{
			if(i&(1<<j))
			{
				rep(k, m)
				{
					temp[k] += a[j][k];
				}
				temp_ans += c[j];
			}
		}
		int fl = 1;
		rep(j, m)
		{
			if(temp[j] < x){
				fl = 0;
			}
		}
		if(fl){
			ans = min(temp_ans, ans);
		}
	}
	if(ans == INT_MAX)
		cout<<-1<<endl;
	else
		cout<<ans<<endl;
}


Measured memory_bytes: 3632