#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define M 100050
#define N 1050
typedef long long ll;
class edge{
	public:int to,nxt,f;
}e[M<<1];
int head[N],Top=1;
inline void add(int u,int v){
	e[++Top].to=v;
	e[Top].nxt=head[u];
	head[u]=Top;
	e[Top].f=1;
	
	e[++Top].to=u;
	e[Top].nxt=head[v];
	head[v]=Top;
	e[Top].f=0;
}
#define min(a,b) ((a)<(b)?(a):(b))
#define id(x) (((x)-1)/m+1)
int S,T,cur[N],dep[N];
int dfs(int u,int flw){
	if(u==T) return flw;
//	printf("** %d\n",u);
	for(int &i=cur[u],v;i;i=e[i].nxt){
		v=e[i].to;
		if(e[i].f<=0||dep[v]!=dep[u]+1)continue;
		int flow=dfs(v,min(flw,e[i].f));
		if(flow){
			e[i].f-=flow;
			e[i^1].f+=flow;
			return flow;
		}
	}
}
std::queue<int> q;
bool bfs(){
	for(int i=1;i<=T;++i)
		dep[i]=0;
	dep[S]=1;
	q.push(S);
	while(!q.empty()){
		int u=q.front();q.pop();
//		printf("** %d\n",u);
		for(int i=head[u],v;i;i=e[i].nxt){
			v=e[i].to;
			if(dep[v]==0&&e[i].f>0){
				dep[v]=dep[u]+1;
				q.push(v);
			}
		}
	}
	return dep[T];
}
void dinic(){
	while(bfs()){
//		printf("\n**");
//		for(int i=1;i<=T;++i)
//			printf(" %d",dep[i]);
//		printf("\n\n");
		for(int i=1;i<=T;++i)
			cur[i]=head[i];
		while(dfs(S,10000));
//		for(int i=2;i<=Top;i+=2)
//			printf("** %d %d\n",e[i].f,e[i+1].f);
	}
}
int n,m,a[250][250],b[250][250];
std::vector<int> c[250][250];
void update(int x,int i,int j){
//	printf("*** %d %d %d\n",b[i][j],c[i][x].back(),c[i][x].size());
	b[i][j]=c[i][x].back();
	c[i][x].pop_back();
}
void work(int num){
	for(int i=1;i<=n;++i){
		add(S,i);
		add(i+n,T);
	}
	dinic();
//	printf("** %d\n",num);
	for(int i=n+1;i<=2*n;++i){
//		printf("** %d\n",i);
		for(int j=head[i];j;j=e[j].nxt){
//			printf("*** %d\n",j);
			if(e[j].f){
//				printf("** %d %d %d\n",i-n,e[j].to,num);
				e[j].f=0;
				update(i-n,e[j].to,num);
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	S=n*2+1;
	T=S+1;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j){
			scanf("%d",&a[i][j]);
//			printf("** %d %d\n",i,id(a[i][j]));
			c[i][id(a[i][j])].push_back(a[i][j]);
			add(i,n+id(a[i][j]));
		}
	for(int i=1;i<=m;++i){
		work(i);
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			a[id(b[i][j])][j]=b[i][j];
			printf("%d ",b[i][j]);
		}puts("");
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j)
			printf("%d ",a[i][j]);
		puts("");
	}
	return 0;
}
/*
3 2
2 6
4 3
1 5
*/