#include "bits/stdc++.h"
using namespace std;

#define FAST ios_base::sync_with_stdio(false); cin.tie(0);
#define pb push_back
#define eb emplace_back
#define ins insert
#define ph push
#define f first
#define s second
#define cbr cerr << "hi\n"
#define mmst(x, v) memset((x), v, sizeof ((x)))
#define siz(x) ll(x.size())
#define all(x) (x).begin(), (x).end()
#define lbd(x, y) lower_bound(all(x), y)
#define ubd(x, y) upper_bound(all(x), y)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());    //can be used by calling rng() or shuffle(A, A+n, rng)
inline long long rand(long long x, long long y) { return (rng() % (y+1-x)) + x; } //inclusivesss
string inline to_string(char c) {string s(1,c);return s;} template<typename T> inline T gcd(T a,T b){ return a==0?llabs(b):gcd(b%a,a); }

typedef long long ll; 
typedef long double ld;
#define FOR(i,s,e) for(ll i=s;i<=ll(e);++i)
#define DEC(i,s,e) for(ll i=s;i>=ll(e);--i)
typedef pair<ll,ll>pi; typedef pair<ll,pi>spi; typedef pair<pi,pi>dpi;

#define LLINF ((long long) 1e18)//1234567890987654321
#define INF 1234567890ll
// #define cerr if(0)cout
#define MAXN (106)
ll n,m,grid[MAXN][MAXN],A[MAXN][MAXN],B[MAXN][MAXN];
vector<pi> v[MAXN];
int match[MAXN];//match[i]=index of edge from i
ll paired[MAXN];
bitset<MAXN>vis;
void bp() {
	mmst(match,-1);mmst(paired,-1);
	function<ll(ll)>dfs=[&](ll x){
		if(vis[x])return 0;
		vis[x]=1;
		ll co=0;
		for(auto i:v[x]){
			if(paired[i.f]==-1 || dfs(paired[i.f])){
				paired[i.f]=x;
				match[x]=co;
				return 1;
			}
			++ co;
		}
		return 0;
	};
	FOR(i,0,n-1)if(match[i]==-1)vis.reset(),dfs(i);
}
int main(){
	FAST
	cin>>n>>m;
	auto which_row=[&](ll x){
		return x/m;
	};
	FOR(i,0,n-1)FOR(j,0,m-1)cin>>grid[i][j],--grid[i][j];
	FOR(i,0,n-1)FOR(j,0,m-1){ll k=which_row(grid[i][j]);v[i].eb(k,grid[i][j]);}
	FOR(j,0,m-1){
		bp();
		FOR(i,0,n-1){
			assert(match[i]!=-1&&siz(v[i])>match[i]);
			A[i][j]=v[i][match[i]].s;
			v[i].erase(v[i].begin()+match[i]);
		}
	}
	FOR(i,0,n-1)assert(v[i].empty());
	FOR(i,0,n-1)FOR(j,0,m-1)cout<<A[i][j]+1<<" \n"[j==m-1];
	FOR(j,0,m-1){
		set<int>s;
		FOR(i,0,n-1)s.ins(which_row(A[i][j]));
		assert(s.size()==n);
	}
	FOR(j,0,m-1){
		FOR(i,0,n-1){
			B[which_row(A[i][j])][j]=A[i][j];
		}
	}
	FOR(i,0,n-1)FOR(j,0,m-1)cout<<B[i][j]+1<<" \n"[j==m-1];
}
