#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct State {
int ub;
int idx;
int picked;
int mx[6];
bool operator<(const State& o) const {
return ub < o.ub;
}
};
int n, k, c;
int a[501][6];
int s[501][6];
priority_queue<State> q;
int calc(int idx, int picked, int curr[]) {
if(picked == k) {
int sum = 0;
for(int i = 0; i < k; i++) sum += curr[i];
return sum;
}
int res = 0;
assert(idx <= n);
for(int i = 0; i < k; i++) {
res += max(curr[i], s[idx][i]);
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k >> c;
vector<pair<int, vector<int>>> A(n);
for(int i = 0; i < n; i++) {
int sum = 0; vector<int> tmp(k);
for(int j = 0; j < k; j++) {
cin >> tmp[j];
sum += tmp[j];
}
A[i] = {sum, tmp};
}
sort(A.rbegin(), A.rend());
for(int i = 0; i < n; i++)
for(int j = 0; j < k; j++)
a[i][j] = A[i].second[j];
for(int i = n - 1; ~i; i--)
for(int j = 0; j < n; j++)
s[i][j] = max(s[i + 1][j], a[i][j]);
State initial;
initial.idx = 0;
initial.picked = 0;
memset(initial.mx, 0, sizeof(initial.mx));
initial.ub = calc(0, 0, initial.mx);
q.push(initial);
int cnt = 0;
while(!q.empty()) {
State cur = q.top();
q.pop();
if(cur.picked == k) {
cnt++;
if(cnt == c) {
cout << cur.ub;
return 0;
}
continue;
}
if(cur.idx >= n) continue;
if(cur.picked < k) {
State nxt;
nxt.idx = cur.idx + 1;
nxt.picked = cur.picked + 1;
for(int j = 0; j < k; j++) nxt.mx[j] = max(cur.mx[j], a[cur.idx][j]);
nxt.ub = calc(nxt.idx, nxt.picked, nxt.mx);
q.push(nxt);
}
if(n - cur.idx - 1 >= k - cur.picked) {
State nxt = cur;
nxt.idx++;
nxt.ub = calc(nxt.idx, nxt.picked, nxt.mx);
q.push(nxt);
}
}
return 0;
}