#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int a[251][251],n,m,k; vector<int> G[251];
int link[251]; bool vis[251];
bool dfs(int x){
for(int i=0;i<G[x].size();++i){
int e=G[x][i]; if(!vis[e]){
vis[e]=1;
if(!link[e]||dfs(link[e])){
link[e]=x; return 1;
}
}
}
return 0;
}
bool check(int v){
for(int i=1;i<=n;++i) G[i].clear();
for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if(a[i][j]<=v) G[i].push_back(j);
memset(link,0,sizeof link); int ans=0;
for(int i=1;i<=n;++i){
memset(vis,0,sizeof vis);
if(dfs(i)){
++ans; if(ans==n-k+1) return 1;
}
}
return 0;
}
int main(){
int l=0x3f3f3f3f,r=0; scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;++i) for(int j=1;j<=m;++j){
scanf("%d",&a[i][j]);
if(a[i][j]<l) l=a[i][j]; if(a[i][j]>r) r=a[i][j];
}
for(;l!=r;){
int mid=(l+r)/2;
if(check(mid)) r=mid;else l=mid+1;
}
printf("%d",l); return 0;
}