//marico el que lo lea
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <stdlib.h>
#include <assert.h>
using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> ii;

void fastIO() {std::ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);}

#define pb push_back
#define all(obj) obj.begin(), obj.end()
#define ms(obj, val) memset(obj, val, sizeof(obj))
#define ms2(obj, val, sz) memset(obj, val, sizeof(obj[0])*sz)

#define fst first
#define snd second

template<typename T, typename U> inline void mnze(T &x, U y) {if(y < x) x = y;}
template<typename T, typename U> inline void mxze(T &x, U y) {if(x < y) x = y;}

void _scan( int &x ) { scanf("%d",&x); }
void _scan( long long &x ) { scanf("%lld",&x); }
void _scan( double &x ) { scanf("%lf",&x); }
void _scan( char &x ) { scanf(" %c",&x); }
void _scan( char *x ) { scanf("%s",x); }
template<typename T>
void _scan( vector<T> &v ){
	for(int i=0; i<(int)v.size(); i++) _scan(v[i]);
}
void scan() {}
template<typename T, typename... U>
void scan( T& head, U&... tail ) { _scan(head); scan(tail...);}

template<typename T> void _dbg(const char* sdbg, T h)
	{ cerr<<sdbg<<"="<<h<<"\n"; }
template<typename T, typename... U> void _dbg(const char* sdbg, T h, U... t) {
	while(*sdbg != ',')cerr<<*sdbg++;
	cerr<<"="<<h<<","; _dbg(sdbg+1, t...);
}

#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#define debugv(x) {{cerr<<#x<<" = "; for(auto _i:x) cerr<<_i<<", ";cerr<<"\n";}}
#define debuga(x, sz) {{cerr<<#x<<" = ";for(int _i=0;_i<sz;_i++)cerr<<x[_i]<<", ";cerr<<"\n";}}
#else
#define debug(...) (__VA_ARGS__)
#define debugv(x)
#define debuga(x, sz)
#define cerr if(0)cout
#endif

ll MOD = 1e9+7;

inline ll Msum(ll x){return x;}
template<typename... Rest>
inline ll Msum(ll x, Rest... rest){ return (x + Msum(rest...)) % MOD; }

inline ll Mprod(ll x){return x;}
template<typename... Rest>
inline ll Mprod(ll x, Rest... rest){ return x * Mprod(rest...) % MOD; }

inline ll Mnorm(ll x){ return (x%MOD + MOD) %MOD; }

inline ll Msq(ll x){ return (x*x) %MOD; }
inline ll Mpot(ll x, ll e){
	if(!e) return 1;
	return Msq(Mpot(x, e>>1)) * (e & 1 ? x : 1)%MOD;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

const int MAXN = 230;
const int INF = 1<<29;
const int NIL = 0;

// A enumerado de 1 a A
// B enumerado de A+1 a A+B < MAXN
vi G[MAXN];
int A, B, match[MAXN], dist[MAXN];

bool bfs() {
	queue<int> q;
	for(int i=1; i<A+1; i++){
		if(match[i]==NIL) {
			dist[i]=0;
			q.push(i);
		} else dist[i]=INF;
	}
	dist[NIL] = INF;
	while(!q.empty()) {
		int u = q.front(); q.pop();
		if(u!=NIL) {
			for(int v : G[u]){
				if(dist[match[v]]==INF) {
					dist[match[v]] = dist[u] + 1;
					q.push(match[v]);
				}
			}
		}
	}
	return (dist[NIL]!=INF);
}

bool dfs(int u) {
	if(u!=NIL) {
		for(int v : G[u]){
			if(dist[match[v]]==dist[u]+1) {
				if(dfs(match[v])) {
					match[v] = u;
					match[u] = v;
					return true;
				}
			}
		}
		dist[u] = INF;
		return false;
	}
	return true;
}

int HK(){
	ms(match, 0);
	int MBM = 0;
	while(bfs())
		for(int i=1; i<A+1; i++)
			if(match[i]==NIL && dfs(i)) MBM++;
	return MBM;
}

const int MAXR = 1e2+2;

int R, C;
int a[MAXR][MAXR];

int ri(int r, int c){return (a[r][c]-1)/C;}
int ci(int r, int c){return (a[r][c]-1)%C;}

int main(){
	scan(R, C);
	for(int r=0; r<R; r++) for(int c=0; c<C; c++) scan(a[r][c]);

	A = B = R;
	for(int c=0; c<C; c++){
		for(int i=0; i<2*R+1; i++) G[i].clear();

		for(int r=0; r<R; r++){
			for(int cc=c; cc<C; cc++){
				G[1+r].pb(1+R+ri(r, cc));
			}
		}

		assert(HK() == R);
		for(int r=0; r<R; r++){
			int m = match[r+1]-1-R;
			for(int cc=c; cc<C; cc++){
				if(ri(r,cc) == m) swap(a[r][c], a[r][cc]);
			}
		}
	}

	for(int r=0; r<R; r++){
		for(int c=0; c<C; c++) printf("%d ", a[r][c]);
		printf("\n");
	}

	for(int c=0; c<C; c++){

		vi col;
		for(int r=0; r<R; r++) col.pb(a[r][c]);
		sort(all(col));
		for(int r=0; r<R; r++) a[r][c] = col[r];
	}

	for(int r=0; r<R; r++){
		for(int c=0; c<C; c++) printf("%d ", a[r][c]);
		printf("\n");
	}
}


Measured memory_bytes: 384