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: Wrong Answer)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105;
int a[maxn][maxn],b[maxn];
bool use[maxn],st[maxn];
int main(){
    int i,j,k,x,y,n,m;
    bool flg;
    scanf("%d%d",&n,&m);
    for (i=0;i<n;i++) for (j=0;j<m;j++){
        scanf("%d",&a[i][j]); a[i][j]--;
    }
    for (k=0;k<m;k++){
        memset(use,0,sizeof(use));
        for (i=0;i<n;i++){
            j=k;
            while (j<m&&use[a[i][j]/m]) j++;
            if (j==m){
                flg=false;
                memset(st,false,sizeof(st));
                for (y=k;y<m;y++) st[a[i][y]/m]=true;
                for (x=0;!flg&&x<i;x++) if (st[a[x][k]/m])
                    for (y=k+1;!flg&&y<m;y++) if (!use[a[x][y]/m]){
                        flg=true; use[a[x][k]/m]=false;
                        swap(a[x][k],a[x][y]);
                        use[a[x][k]/m]=true;
                    }
                j=k;
                while (j<m&&use[a[i][j]/m]) j++;
            }
            swap(a[i][k],a[i][j]);
            use[a[i][k]/m]=true;
        }
    }
    for (i=0;i<n;i++) for (j=0;j<m;j++)
        printf("%d%c",a[i][j]+1,j<m-1?' ':'\n');
    for (k=0;k<m;k++){
        for (i=0;i<n;i++){
            b[a[i][k]/m]=a[i][k];
        }
        for (i=0;i<n;i++)
            a[i][k]=b[i];
    }
    for (i=0;i<n;i++) for (j=0;j<m;j++)
        printf("%d%c",a[i][j]+1,j<m-1?' ':'\n');
    return 0;
}