#include <bits/stdc++.h>
using namespace std;

typedef long long ll; // -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807

template <class T> using vec = std::vector<T>;
template <class T> using vec2 = vec<vec<T>>;
template <class T> using vec3 = vec<vec<vec<T>>>;

#define DEBUG

template <class T>
class Bitvector{
    private:
    T val;
    public:
    static const int MAX = 64;
    Bitvector(T v = 0){
        val = v;
    }

    static Bitvector<T> ones(int len){
        return Bitvector<T>((1 << len) - 1);
    }

    static Bitvector<T> onehot(int pos){
        return Bitvector<T>(1 << pos);
    }

    static Bitvector<T> full(){
        return Bitvector<T>(-1);
    }

    bool is_empty(){
        return val == 0;
    }

    bool is_any(){
        return !is_empty();
    }

    Bitvector<T> operator&(const Bitvector<T>& rhs) const{
        return Bitvector<T>(val & rhs.val);
    }

    Bitvector<T> operator|(const Bitvector<T>& rhs) const{
        return Bitvector<T>(val | rhs.val);
    }

    Bitvector<T> operator~() const{
        return Bitvector<T>(~val);
    }

    bool operator==(const Bitvector<T>& rhs) const{
        return val == rhs.val;
    }

    bool operator!=(const Bitvector<T>& rhs) const{
        return val != rhs.val;
    }


    Bitvector<T> c() const{
        return ~(*this);
    }

    Bitvector<T> operator-(const Bitvector<T>& rhs) const{
        return (*this) & ~rhs;
    }

    bool is_subset_of(const Bitvector<T>& rhs) const{
        // A ⊂ B は A-B = empty
        return (*this - rhs).is_empty();
    }

    bool operator<=(const Bitvector<T>& rhs) const{
        return is_subset_of(rhs);
    }

    bool operator>=(const Bitvector<T>& rhs) const{
        return rhs <= *this;
    }

    int operator[](int n) const{
        return (val >> n) & 1;
    }

    int next_bit(int n){
        for(int i=n+1; i < MAX; i++){
            if((*this)[i]){
                return i;
            }
        }
        return MAX;
    }

    int first_bit(){
        return next_bit(-1);
    }

    // もうないならfullをかえす
    Bitvector<T> get_next_subset(const Bitvector<T>& rhs){
        for(auto i=Bitvector<T>(rhs.val + 1); i <= full(); i++){
            if(i <= *this){
                return i;
            }
        }
        return full();
    }

    void go_next_subset(Bitvector<T>& rhs){
        auto n = get_next_subset(rhs);
        rhs = n;
    }

    int bits(){
        int res = 0;
        for(int i=0; i < MAX; i++){
            if((*this).at(i)){
                res++;
            }
        }
        return res;
    }

    Bitvector<T> operator++(int n){
        return Bitvector<T>(val++);
    }

    Bitvector<T> on(int pos) const{
        return (*this) | onehot(pos);
    }

    
    Bitvector<T> off(int pos) const{
        return (*this) - onehot(pos);
    }


    string toString(int len){
        string s;
        for(int i=len - 1; i >= 0; i--){
            s += '0' + (*this).at(i);
        }

        return s;
    }

    T raw(){
        return val;
    }
};
typedef Bitvector<long long> BV;

// for(int j=i.first_bit(); j < N; j=i.next_bit(j)){
//     for(int k=i.next_bit(j); k < N; k=i.next_bit(k)){
//         // iのたってるビットのペアをつくる
//     }
// }

// for(auto i=BV(); i <= BV::ones(N); i++){
//     // すべてのサブセットをなめる
// }


// for(auto i=BV(); i <= S; S.go_next_subset(i)){
//     // すべてのサブセットをなめる
// }


// Generated by 1.1.6 https://github.com/kyuridenamida/atcoder-tools  (tips: You use the default template now. You can remove this line by using your custom template)
int main(){
    // Failed to predict input format
    ll N, M, X;
    cin >> N >> M >> X;
    vec<ll> prices;
    vec2<ll> book2alg2pts;
    for(int i=0; i < N; i++){
        int c;
        cin >> c;
        prices.push_back(c);
        book2alg2pts.push_back(vec<ll>());
        for(int j=0; j < M; j++){
            int a;
            cin >> a;
            book2alg2pts.back().push_back(a);
        }
    }

    // solve
    vec<ll> ress;
    for(auto i=BV(); i <= BV::ones(N); i++){
        ll subPrice = 0;
        vec<ll> subPoint(M);
        for(int j=i.first_bit(); j < N; j=i.next_bit(j)){
            subPrice += prices.at(j);
            for(int k=0; k < M; k++){
                subPoint.at(k) += book2alg2pts.at(j).at(k);
            }
        }

        bool ok = true;
        for(int k=0; k < M; k++){
            if(subPoint.at(k) < X){
                ok = false;
            }
        }

        if(ok){
            ress.push_back(subPrice);
        }

    }

    if(ress.empty()){
        cout << -1 << endl;
    }else{
    cout << *min_element(ress.begin(), ress.end()) << endl;
    }

    return 0;
}


Measured memory_bytes: 3664