import numpy as np
n, m, type1, type2 = map(int, input().split())
# 输入m条边,生成对应的邻接矩阵,生成对应的关联矩阵
n_AdjMatrix = np.zeros((n, n), dtype=int)
n_AsMatrix = np.zeros((n, m), dtype=int)
n_AdjLink = [[]for i in range(n)]
n_AdjLink_reverse = [[]for i in range(n)]
if_printAdj = 1
if_printAs = 1
v1_v_v2 = 0
A_forward = []
B_forward = []
Z_forward = []
A_reverse = []
B_reverse = []
Z_reverse = []
for i in range(m):
if type2 == 0:
v1, v2 = map(int, input().split())
if v1 == v2:
if_printAs = 0
else:
if_printAs = 0
v1, v2, v1_v_v2 = map(int, input().split())
if n_AdjMatrix[v1 - 1][v2 - 1] != 0:
if_printAdj = 0
# 生成邻接矩阵或权矩阵
if type2 == 0:
if type1 == 0:
n_AdjMatrix[v1 - 1][v2 - 1] = 1
n_AdjMatrix[v2 - 1][v1 - 1] = 1
else:
n_AdjMatrix[v1 - 1][v2 - 1] = 1
else:
if type1 == 0:
n_AdjMatrix[v1 - 1][v2 - 1] = v1_v_v2
n_AdjMatrix[v2 - 1][v1 - 1] = v1_v_v2
else:
n_AdjMatrix[v1 - 1][v2 - 1] = v1_v_v2
# 生成关联矩阵
n_AsMatrix[v1 - 1][i] = 1
n_AsMatrix[v2 - 1][i] = 1
# 生成邻接表
if type2 == 0:
n_AdjLink[v1 - 1].append(v2)
if type1 == 0:
n_AdjLink[v2 - 1].append(v1)
else:
n_AdjLink_reverse[v2 - 1].append(v1)
else:
n_AdjLink[v1 - 1].append(v2)
n_AdjLink[v1 - 1].append(v1_v_v2)
if type1 == 0:
n_AdjLink[v2 - 1].append(v1)
n_AdjLink[v2 - 1].append(v1_v_v2)
else:
n_AdjLink_reverse[v2 - 1].append(v1)
n_AdjLink_reverse[v2 - 1].append(v1_v_v2)
# 生成正向表
# 无赋权图 向量A:节点1在向量B中的起点(无邻接节点记为1)、节点2、....、向量B的末地址+1 向量B:节点1的邻接节点、节点2的邻接节点、。。。。
B_start = 1
if type2 == 0:
for i in range(n):
if n_AdjLink[i]:
A_forward.append(B_start)
B_start += len(n_AdjLink[i])
for j in range(len(n_AdjLink[i])):
B_forward.append(n_AdjLink[i][j])
else:
A_forward.append(B_start)
A_forward.append(B_start)
else:
for i in range(n):
if n_AdjLink[i]:
A_forward.append(B_start)
B_start += len(n_AdjLink[i])//2
for j in range(0, len(n_AdjLink[i]), 2):
B_forward.append(n_AdjLink[i][j])
Z_forward.append(n_AdjLink[i][j + 1])
else:
A_forward.append(B_start)
A_forward.append(B_start)
B_start_reverse = 1
if type1 == 1:
if type2 == 0:
for i in range(n):
if n_AdjLink_reverse[i]:
A_reverse.append(B_start_reverse)
B_start_reverse += len(n_AdjLink_reverse[i])
for j in range(len(n_AdjLink_reverse[i])):
B_reverse.append(n_AdjLink_reverse[i][j])
else:
A_reverse.append(B_start_reverse)
A_reverse.append(B_start_reverse)
else:
for i in range(n):
if n_AdjLink_reverse[i]:
A_reverse.append(B_start_reverse)
B_start_reverse += len(n_AdjLink_reverse[i])//2
for j in range(0, len(n_AdjLink_reverse[i]), 2):
B_reverse.append(n_AdjLink_reverse[i][j])
Z_reverse.append(n_AdjLink_reverse[i][j + 1])
else:
A_reverse.append(B_start_reverse)
A_reverse.append(B_start_reverse)
str_out = ''
if if_printAdj:
for i in range(n):
str_out = ''
for j in range(n):
str_out += str(n_AdjMatrix[i][j]) + ' '
print(str_out[:-1])
if if_printAs:
for i in range(n):
str_out = ''
for j in range(m):
str_out += str(n_AsMatrix[i][j]) + ' '
print(str_out[:-1])
for i in range(n):
str_out = ''
if n_AdjLink[i]:
for j in range(len(n_AdjLink[i])):
str_out += str(n_AdjLink[i][j]) + ' '
print(str_out[:-1])
str_out = ''
for i in range(len(A_forward)):
str_out += str(A_forward[i]) + ' '
print(str_out[:-1])
str_out = ''
for i in range(len(B_forward)):
str_out += str(B_forward[i]) + ' '
print(str_out[:-1])
str_out = ''
if type2 == 1:
for i in range(len(Z_forward)):
str_out += str(Z_forward[i]) + ' '
print(str_out[:-1])
if type1 == 1:
if type2 == 0:
str_out = ''
for i in range(len(A_reverse)):
str_out += str(A_reverse[i]) + ' '
print(str_out[:-1])
str_out = ''
for i in range(len(B_reverse)):
str_out += str(B_reverse[i]) + ' '
print(str_out[:-1])
else:
str_out = ''
for i in range(len(A_reverse)):
str_out += str(A_reverse[i]) + ' '
print(str_out[:-1])
str_out = ''
for i in range(len(B_reverse)):
str_out += str(B_reverse[i]) + ' '
print(str_out[:-1])
str_out = ''
for i in range(len(Z_reverse)):
str_out += str(Z_reverse[i]) + ' '
print(str_out[:-1])