#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n, k, c;
int a[501][6];
int s[501][6];
int T;
priority_queue<int, vector<int>, greater<>> q;
void add(int cs) {
if(q.size() < c)
q.push(cs);
else if(cs > q.top()) {
q.pop();
q.push(cs);
}
}
void brute(int start, int d, int mx[], int curr) {
if(d == k) {
add(curr);
return;
}
int r = k - d;
for(int i = start; i <= T - r; i++) {
int nmx[6], ns = 0;
for(int j = 0; j < k; j++) {
nmx[j] = max(mx[j], a[i][j]); ns += nmx[j];
}
brute(i + 1, d + 1, nmx, ns);
}
}
void dfs(int start, int d, int mx[], int curr, bool hn) {
int rem = k - d;
if(!hn && T > n - rem) return;
if(d == k) {
if(hn) {
add(curr);
}
return;
}
for(int i = max(start, T); i <= n - rem; i++) {
int ub = 0;
for(int j = 0; j < k; j++)
ub += max(mx[j], s[i][j]);
if(q.size() == c && q.top() >= ub) break;
int nmx[6], ns = 0;
for(int j = 0; j < k; j++) {nmx[j] = max(mx[j], a[i][j]); ns += nmx[j]; }
dfs(i + 1, d + 1, nmx, ns, 1);
}
if(start < T) {
for(int i = start; i <= min(T - 1, n - rem); i++) {
int ub = 0;
for(int j = 0; j < k; j++) ub += max(mx[j], s[i][j]);
if(q.size() == c && q.top() >= ub) break;
int nmx[6], ns = 0;
for(int j = 0; j < k; j++) {
nmx[j] = max(mx[j], a[i][j]); ns += nmx[j];
}
dfs(i + 1, d + 1, nmx, ns, 0);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k >> c;
for(int i = 0; i < n; i++)
for(int j = 0; j < k; j++)
cin >> a[i][j];
vector<int> idx(n);
iota(idx.begin(), idx.end(), 0);
sort(idx.begin(), idx.end(), [&](int x, int y) {
int s1 = 0, s2 = 0;
for(int i = 0; i < k; i++) { s1 += a[x][i]; s2 += a[y][i]; }
return s1 > s2;
});
{
int tmp[501][6];
for(int i = 0; i < n; i++)
for(int j = 0; j < k; j++)
tmp[i][j] = a[idx[i]][j];
for(int i = 0; i < n; i++)
for(int j = 0; j < k; j++)
a[i][j] = tmp[i][j];
}
T = k;
while(T < n) {
ll c = 1;
bool over = 0;
for(int i = 0; i < k; i++) {
c = 1LL * c * ((T + 1) - i) / (i + 1);
if(c > 2000000) { over = 1; break; }
}
if(over) break;
T++;
}
for(int i = n - 1; ~i; i--)
for(int j = 0; j < k; j++)
s[i][j] = max(a[i][j], s[i + 1][j]);
int mx[6] {};
brute(0, 0, mx, 0);
dfs(0, 0, mx, 0, 0);
cout << q.top();
return 0;
}