void main(){
	long n, m, x;
	readf("%d %d %d\n", &n, &m, &x);
	long[][] a; a.length = n;// 参考書とアルゴリズム
	long[] c; // コスト
	long ans = -1;
	// 入力をだーーっと入れていく
	foreach(i; 0..n){
		long[] arr = _scanln!long();
		c ~= arr[0];
		a[i] ~= arr[1..$];
	}

	long[] alg; alg.length = m;
	foreach(bmask; 0..2^^n){
		long cost;
		alg[0..$] = 0;
		foreach(j; 0..n){
			if( (1<<j&bmask)==0 )continue;
			alg[0..$] += a[j][0..$];
			cost += c[j];
		}
		// アルゴリズムの理解度チェック
		long cnt;
		foreach(elm; alg)if(elm>=x)cnt++;
		if(cnt == alg.length){
			// 条件を満たす解である
			if( ans > cost || ans==-1)ans = cost;
		}
	}
	ans.writeln();
}

import std.stdio, std.conv, std.algorithm, std.numeric, std.string, std.math;

// 1要素のみの入力
T _scan(T= int)(){
	return to!(T)( readln().chomp() );
}

// 1行に同一型の複数入力
T[] _scanln(T = int)(){
	T[] ln;
	foreach(string elm; readln().chomp().split()){
		ln ~= elm.to!T();
	}
	return ln;
}
