#include<bits/stdc++.h>
#define ll long long
using namespace std;
template<typename tn> void read(tn &a){
	tn x=0,f=1; char c=' ';
	for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
	for(;isdigit(c);c=getchar()) x=x*10+c-'0';
	a=x*f;
}
struct edge{int v,nxt,f;};
class Graph{
	edge e[200100];
	int tot,head[1010],cur[1010],b[1010];
public:
	int t;
	Graph(){tot=1;memset(head,0,sizeof(head));}
	void add(int x,int y,int z){
		e[++tot]={y,head[x],z};
		head[x]=tot;
		e[++tot]={x,head[y],0};
		head[y]=tot;
	}
	bool bfs(){
		memset(b,0,sizeof(b));b[0]=1;
		queue<int> q;q.push(0);
		while(!q.empty()){
			int u=q.front();q.pop();
			for(int i=head[u];i;i=e[i].nxt)
				if(e[i].f&&!b[e[i].v]){
					b[e[i].v]=b[u]+1;
					q.push(e[i].v);
				}
		}
		return b[t];
	}
	int dfs(int x,int flow){
		if(x==t||!flow) return flow;
		int f=flow,tmp;
		for(int &i=cur[x];i;i=e[i].nxt)
			if(b[e[i].v]==b[x]+1&&(tmp=dfs(e[i].v,min(e[i].f,f)))){
				f-=tmp;
				e[i].f-=tmp;e[i^1].f+=tmp;
				if(!f) break;
			}
		return flow-f;
	}
	int Dinic(){
		int ans=0;
		while(bfs()){
			memcpy(cur,head,sizeof(cur));
			ans+=dfs(0,100000000);
		}
		return ans;
	}
	int chk(int x){
		for(int i=head[x];i;i=e[i].nxt)
			if(e[i].v&&!e[i].f) return e[i].v;
	}
};
int n,m,a[110][110],ans1[110][110],ans2[110][110];
stack<int> h[110][110];
int main(){
	read(n);read(m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			int x;read(x);
			h[i][(x-1)/m+1].push(x);
		}
	for(int k=1;k<=m;k++){
		Graph G;G.t=2*n+1;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(h[i][j].size()) G.add(i,j+n,1);
		for(int i=1;i<=n;i++)
			G.add(0,i,1),G.add(i+n,G.t,1);
		G.Dinic();
		for(int i=1;i<=n;i++){
			int p=G.chk(i)-n;
			int now=h[i][p].top();h[i][p].pop();
			ans1[i][k]=now;
			ans2[p][k]=now;
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cout<<ans1[i][j]<<" \n"[j==m];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cout<<ans2[i][j]<<" \n"[j==m];
	return 0;
}
