#include <stdio.h>
#define MAXSIZE 12500		// 假设非零元个数的最大值为12500
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;		// 定义基本元素的类型为 int 型
typedef struct{
	int i, j;				// 该非零元的行下标和列下标
	ElemType e;
}Triple;

typedef struct{
	Triple data[MAXSIZE+1];	// 非零元三元组表,data[0]未用
	int mu, nu, tu;			// 矩阵的行数、列数和非零元个数
}TSMatrix;

void InputMatrix(TSMatrix &M){
	// 读入矩阵 M,r、c为该矩阵的行和列数
	int i, j;
	int data;	// 用来存储临时读取近来的数据
	M.tu = 0;	// 先将非零元地数目初始化为0
	for(i=1; i<=M.mu; i++){
		for(j=1; j<=M.nu; j++){
			scanf("%d", &data);			// 读入元素
			if(data){					// 如果 data 为非零元
				M.tu++;					// 先对非零元地数目加1,因为data[0]未用
				M.data[M.tu].e = data;	// 储存非零元
				M.data[M.tu].i = i;		// 记录当前元素的行号
				M.data[M.tu].j = j;		// 记录当前元素的列号
			}
		}
	}
}

void OutputMatrix(TSMatrix M){
	// 输出矩阵
	int i, j;		// 定义迭代变量
	int t = 1;			// 定位需要输出矩阵中的位置
	for(i=1; i<=M.mu; i++){
		for(j=1; j<=M.nu; j++){
			if(i==M.data[t].i && j==M.data[t].j){	// 需要输出非零元
				printf("%d ", M.data[t].e);
				t++;		// 定位下次需要输出的元素
			}else{
				printf("0 ");	// 输出零元
			}
		}
		putchar('\n');			// 换行
	}
}

Status TransposeSMatrix(TSMatrix M, TSMatrix &T) { // 算法5.1
	// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
	int p, q, col;
	T.mu = M.nu;
	T.nu = M.mu;
	T.tu = M.tu;
	if (T.tu) {
		q = 1;
		for (col = 1; col <= M.nu; ++col)
			for (p = 1; p <= M.tu; ++p)
				if (M.data[p].j == col) {
					T.data[q].i = M.data[p].j;
					T.data[q].j = M.data[p].i;
					T.data[q].e = M.data[p].e;
					++q;
				}
	}
	return OK;
} // TransposeSMatrix

int main(){

	TSMatrix M, T;	// 定义存储矩阵的变量
	scanf("%d%d", &M.mu, &M.nu);
	InputMatrix(M);
	TransposeSMatrix(M, T);
	OutputMatrix(T);

	return 0;
}

/**************************************************************
	Problem: 2153
	User: admin
	Language: C++
	Result: Accepted
	Time:16 ms
	Memory:1612 kb
****************************************************************/