#include<bits/stdc++.h>
using namespace std;
deque<int> deq,deq1;
int n,m,cnt1,a[105][105],X[105][105],x[105][105],cnt,ANS[105][105],ans[105][105],t;
int main(){
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
//输入
for(int f=1;f<=n;f++){
cnt=0;
deq.clear();
deq1.clear();
for(int i=1;i<=m;i++){
if(!deq.empty()&&i-deq.front()==t) deq.pop_front();
if(!deq1.empty()&&i-deq1.front()==t) deq1.pop_front();
while(!deq.empty()&&a[f][deq.back()]<=a[f][i]) deq.pop_back();
while(!deq1.empty()&&a[f][deq1.back()]>=a[f][i]) deq1.pop_back();
deq.push_back(i);
deq1.push_back(i);
if(i>=t) X[f][++cnt]=a[f][deq.front()];
if(i>=t) x[f][cnt]=a[f][deq1.front()];
}
}
//求每一行最大值,最小值
for(int f=1;f<=cnt;f++){
cnt1=0;
deq.clear();
deq1.clear();
for(int i=1;i<=n;i++){
if(!deq.empty()&&i-deq.front()==t) deq.pop_front();
if(!deq1.empty()&&i-deq1.front()==t) deq1.pop_front();
while(!deq.empty()&&a[deq.back()][f]<=X[i][f]) deq.pop_back();
while(!deq1.empty()&&a[deq1.back()][f]>=x[i][f]) deq1.pop_back();
deq.push_back(i);
deq1.push_back(i);
if(i>=t) ANS[++cnt1][f]=X[deq.front()][f];
if(i>=t) ans[cnt1][f]=x[deq1.front()][f];
}
}
//求每一列最大,最小值(在每一行的基础上)
for(int i=1;i<=cnt1;i++){
for(int j=1;j<=cnt;j++){
printf("%d ",ANS[i][j]);
}
printf("\n");
}
printf("\n");
for(int i=1;i<=cnt1;i++){
for(int j=1;j<=cnt;j++){
printf("%d ",ans[i][j]);
}
printf("\n");
}
return 0;
}