Problem:
Score : 1100 points

Problem Statement

We have a grid with N rows and M columns of squares.
Each integer from 1 to NM is written in this grid once.
The number written in the square at the i-th row from the top and the j-th column from the left is A_{ij}.

You need to rearrange these numbers as follows:

First, for each of the N rows, rearrange the numbers written in it as you like.

Second, for each of the M columns, rearrange the numbers written in it as you like.

Finally, for each of the N rows, rearrange the numbers written in it as you like.

After rearranging the numbers, you want the number written in the square at the i-th row from the top and the j-th column from the left to be M\times (i-1)+j.
Construct one such way to rearrange the numbers. The constraints guarantee that it is always possible to achieve the objective.

Constraints

1 \leq N,M \leq 100

1 \leq A_{ij} \leq NM

A_{ij} are distinct.

Input

Input is given from Standard Input in the following format:

N M
A_{11} A_{12} ... A_{1M}
:
A_{N1} A_{N2} ... A_{NM}

Output

Print one way to rearrange the numbers in the following format:

B_{11} B_{12} ... B_{1M}
:
B_{N1} B_{N2} ... B_{NM}
C_{11} C_{12} ... C_{1M}
:
C_{N1} C_{N2} ... C_{NM}

Here B_{ij} is the number written in the square at the i-th row from the top and the j-th column from the left after Step 1, and C_{ij} is the number written in that square after Step 2.

Sample Input 1

3 2
2 6
4 3
1 5

Sample Output 1

2 6
4 3
5 1
2 1
4 3
5 6

Sample Input 2

3 4
1 4 7 10
2 5 8 11
3 6 9 12

Sample Output 2

1 4 7 10
5 8 11 2
9 12 3 6
1 4 3 2
5 8 7 6
9 12 11 10

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>

using namespace std;

#define REP(i,n) for(ll (i) = (0);(i) < (n);++i)
#define REV(i,n) for(ll (i) = (n) - 1;(i) >= 0;--i)
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v,n) {REP(WW,n)cerr << v[WW] << ' ';cerr << endl << endl;}
#define SHOW2d(v,WW,HH) {REP(W_,WW){REP(H_,HH)cerr << v[W_][H_] << ' ';cerr << endl;}cerr << endl;}
#define ALL(v) v.begin(),v.end()
#define Decimal fixed<<setprecision(20)
#define INF 1000000000
#define LLINF 1000000000000000000LL
#define MOD 998244353

typedef long long ll;
typedef pair<ll,ll> P;

int ch[111111];
int mp[111][111];
int used[111];
bool used_gyou[111];
int n, m;

void init(){
	int cou = 0;
	for(int i = 1;i < 111111;i++){
		ch[i] = cou;
		if(i % m == 0){
			cou++;
		}
	}

	REP(i, n){
		REP(j, m){
			cin >> mp[i][j];
		}
	}
}

bool check_gyou(int now_retsu, int now_gyou) {
	//cout << "check_gyou " << now_retsu << " " << now_gyou << endl;
	used_gyou[now_gyou] = true;
	for(int i = now_retsu; i < m;i++){
		if(used[ch[mp[now_gyou][i]]] == -1){
			used[ch[mp[now_gyou][i]]] = now_gyou;
			swap(mp[now_gyou][now_retsu], mp[now_gyou][i]);
			return true;
		}
	}

	for(int i = now_retsu; i < m;i++){
		if(used_gyou[used[ch[mp[now_gyou][i]]]]){
			if(check_gyou(now_retsu, used[ch[mp[now_gyou][i]]])){
				used[ch[mp[now_gyou][i]]] = now_gyou;
				swap(mp[now_gyou][now_retsu], mp[now_gyou][i]);
				return true;
			}
		}
	}

	return false;
}

void seica_gyou(){
	REP(retsu, m){
		REP(i, 111){
			used[i] = -1;
		}

		REP(gyou, n){
			bool flag = false;
			for(int i = retsu;i < m;i++){
				//cout << "# " << gyou << " " << retsu << " " << i << " " << mp[gyou][i] << " " << used[ch[mp[gyou][i]]] << endl;
				if(used[ch[mp[gyou][i]]] == -1){
					used[ch[mp[gyou][i]]] = gyou;
					swap(mp[gyou][retsu], mp[gyou][i]);
					flag = true;
					break;
				}
			}

			if(flag){
				//cout << "A " << gyou << " " << retsu << " " << mp[gyou][retsu] << endl;
				continue;
			}

			REP(i, 111){
				used_gyou[i] = false;
			}
			for(int i = retsu;i < m;i++){
				if(check_gyou(retsu, used[ch[mp[gyou][i]]])){
					used[ch[mp[gyou][i]]] = gyou;
					swap(mp[gyou][retsu], mp[gyou][i]);
					flag = true;
					break;
				}
			}

			if(!flag){
				cout << "!!!" << endl;
				exit(1);
			}
			//cout << "B ";REP(i, gyou+1)cout << mp[i][retsu] << " ";cout << endl;
		}
		/*
		REP(i, n){
			REP(j, m){
				cout << mp[i][j] << " ";
			}
			cout << endl;
		}
		cout << endl;
		*/
	}
}

void seica_retsu() {
	REP(retsu, m){
		vector<int> v;
		REP(gyou, n){
			v.PB(mp[gyou][retsu]);
		}

		sort(ALL(v));
		REP(gyou, n){
			mp[gyou][retsu] = v[gyou];
		}
	}
}

int main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);
	cin >> n >> m;
	init();
	seica_gyou();
	REP(i, n){
		REP(j, m){
			cout << mp[i][j] << " ";
		}
		cout << endl;
	}
	seica_retsu();
	REP(i, n){
		REP(j, m){
			cout << mp[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}