#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i=0;i<n;i++)
#define all(cont) cont.begin(), cont.end()
#define unique(a)  sort(all(a)) , (a).erase(unique((a).begin(), (a).end()),(a).end())
#define rall(cont) cont.rbegin(), cont.rend()
#define sz(x) (int)(x).size()
#define fastio          ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define PB push_back
#define endl "\n"
#define f first
#define s second
#define mset(m,v) memset(m,v,sizeof(m))
#define mod 1000000007
const int N = 2e5 + 5;
#define PI acos(-1.0)
long double EPS = 1e-9;
typedef long long ll;
#define int long long
typedef long double ld;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef vector<pair<int, int>> vpii;
#define pqll_max priority_queue<ll> // max heap. push(),pop(),top(),size(),empty()
#define pqll_min priority_queue<ll,vector<ll>,greater<ll> >
#define lb(v,val)   lower_bound(v.begin(),v.end(),val) //first equal to or lower than [------------
#define ub(v,val)   upper_bound(v.begin(),v.end(),val) //first greater than ------------)
#define bs(v,x) binary_search(v.begin(),v.end(),x)
inline ll add(ll x, ll y) { x += y; if (x >= mod) x -= mod; return x; }
inline ll sub(int x, int y) { x -= y; if (x < 0) x += mod; return x; }
inline ll mul(ll x, ll y) { return (x%mod * 1ll * y%mod) % mod; }
inline ll pwr(ll a, ll b) { ll x = 1 % mod; while (b) { if (b & 1) x = mul(x, a); a = mul(a, a); b >>= 1; }return x % mod; }
inline ll inv(ll a) { return pwr(a, mod - 2) % mod; }
ll gcd(ll a, ll b) { if (!a)return b % mod; return gcd(b%a, a) % mod; }
#define debug(x) cout << #x << " = " << x << endl;
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
	cout << name << " : " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
	const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1 << " | "; __f(comma + 1, args...);
}
#define in(container) for (auto &it : container) cin>>it;
#define out(container) for (auto it : container) cout << it << " "; cout << endl;
void solve() {

	int n, m, k;
	cin >> n >> m >> k;
	vector<vector<int> > v(n, vector<int>(m, 0));
	vi cost(n);
	rep(i, n) {
		cin >> cost[i];
		rep(j, m) {
			cin >> v[i][j];
		}
	}
	unsigned int opsize = pow(2, n);
	int ans = LLONG_MAX;

	/* Run from counter 000..1 to 111..1*/
	vector <vector<int> >currentSubsequenceList;
	vector <int >costlist;
	for (int counter = 1; counter < opsize; counter++)
	{
		if (counter == opsize-1) {
			int ok = 1;
		}
		currentSubsequenceList.clear();
		costlist.clear();
		for (int j = 0; j < n; j++)
		{
			/* Check if jth bit in the counter is set
				If set then print jth element from arr[] */

			if (counter & (1 << j))
			{
				currentSubsequenceList.PB(v[j]);
				costlist.PB(cost[j]);


			}
		}

		vi check(m, 0);
		for (int i = 0; i < currentSubsequenceList.size(); i++) {
			for (int j = 0; j < sz(currentSubsequenceList[i]); j++) {
				check[j] += currentSubsequenceList[i][j];
			}
		}
		if (*min_element(all(check)) >= k) {
			ans = min(ans, accumulate(all(costlist), 0LL));
		}
	}
	if(ans!=LLONG_MAX)
	cout << ans << endl;
	else cout << -1 << endl;
	
	
}
signed main()
{
	fastio;
	//cout<<fixed<<setprecision(15);
	//clock_t begin = clock();
	int tc;
	tc = 1;
	//cin >> tc;
	while (tc--) {
		solve();
	}
	//clock_t end = clock();double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;cerr << elapsed_secs;
}


//Error?
// clear lists for every test case
// print new line for each tc
// check for int or ll
// check if problem can be solved without any heavy DS like priority_queue or map



Measured memory_bytes: 4076