#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define CL(a,x) memset(a, x, sizeof(a))
const int N = 205;

int cap[N][N];
bool vis[N];
int S,T,SZ,n,m;
int a[N>>1][N>>1];

int dfs(int x,int flow){
	if(vis[x]) return 0;
	vis[x]=true;
	if(x==T) return flow;
	rep(y,0,SZ)	if(cap[x][y] && !vis[y]){
		int tmp=dfs(y,min(flow,cap[x][y]));
		if(tmp>0){
			cap[x][y]-=tmp;
			cap[y][x]+=tmp;
			return tmp;
		}
	}
	return 0;
}

int main(){
	scanf("%d%d",&n,&m);
	S = 0, T = SZ = 2 * n + 1;
	rep(i,1,n)rep(j,1,m){
		scanf("%d",a[i]+j);
		++cap[i][(a[i][j]-1)/m+n+1];
	}
	rep(k,1,m-1){
		rep(i,1,n) cap[S][i] = cap[i+n][T] = 1;
		for(CL(vis,0);dfs(S,1e9);CL(vis,0));
		rep(i,1,n)rep(j,n+1,2*n)if(cap[j][i]){
			cap[j][i] = 0;
			rep(x,k+1,m) if( (a[i][x]-1)/m+n+1 == j){
				swap(a[i][k], a[i][x]);
				break;
			}
		}
	}
	rep(i,1,n)rep(j,1,m)printf("%d%c",a[i][j],j==m?'\n':' ');
	rep(j,1,m){
		int tmp[N];
		rep(i,1,n) tmp[i] = a[i][j];
		sort(tmp+1, tmp+n+1);
		rep(i,1,n) a[i][j] = tmp[i];
	}
	rep(i,1,n)rep(j,1,m)printf("%d%c",a[i][j],j==m?'\n':' ');
	return 0;
}