rt
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cctype>
#include <stack>
#include <queue>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <unordered_set>
#include <unordered_map>
#define int ll
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int MOD = 998244353;
const int mod = 1e9 + 7;
int n, m, ty1, ty2, u, v, w;
vector<pii> a[1005], rev[305];
int g[305][305], gl[205][305], chong, zih, A[305], B[90005], Z[90005], vis[305][305];
signed main(){
cin >> n >> m >> ty1 >> ty2;
for (int i = 1; i <= m; i++){
if (ty2 == 0){
cin >> u >> v;
if (u == v) zih = 1;
if (ty1 == 0){
a[u].push_back({v, 1});
a[v].push_back({u, 1});
rev[u].push_back({v, 1});
rev[v].push_back({u, 1});
g[u][v] = 1, g[v][u] = 1;
gl[u][i] = 1, gl[v][i] = 1;
} else {
a[u].push_back({v, 1});
rev[v].push_back({u, 1});
g[u][v] = 1;
gl[u][i] = 1;
gl[v][i] = -1;
}
if (vis[u][v] == 1) chong = 1;
if (ty1 == 0) vis[u][v] = vis[v][u] = 1;
else vis[u][v] = 1;
} else {
cin >> u >> v >> w;
if (u == v) zih = 1;
if (ty1 == 0){
a[u].push_back({v, w});
a[v].push_back({u, w});
rev[u].push_back({v, w});
rev[v].push_back({u, w});
g[u][v] = w, g[v][u] = w;
} else {
a[u].push_back({v, w});
rev[v].push_back({u, w});
g[u][v] = w;
}
if (vis[u][v] == 1) chong = 1;
if (ty1 == 0) vis[u][v] = vis[v][u] = 1;
else vis[u][v] = 1;
}
}
if (!chong){
for (int i = 1; i <= n; i++, cout << "\n") for (int j = 1; j <= n; j++) cout << g[i][j] << " ";
}
if (ty2 == 0 && zih == 0){
for (int i = 1; i <= n; i++, cout << "\n") for (int j = 1; j <= m; j++) cout << gl[i][j] << " ";
}
if (ty2 == 0){
for (int i = 1; i <= n; i++, cout << "\n") for (pii j: a[i]) cout << j.first << " ";
} else {
for (int i = 1; i <= n; i++, cout << "\n") for (pii j: a[i]) cout << j.first << " " << j.second << " ";
}
A[1] = 1;
int k = 0;
for (int i = 1; i <= n; i++){
A[i + 1] = A[i] + a[i].size();
for (pii j: a[i]){
B[++k] = j.first;
if (ty2 == 1) Z[k] = j.second;
}
}
for (int i = 1; i <= n + 1; i++) cout << A[i] << " ";
cout << "\n";
for (int i = 1; i <= k; i++) cout << B[i] << " ";
cout << "\n";
if (ty2 == 1){
for (int i = 1; i <= k; i++) cout << Z[i] << " ";
cout << "\n";
}
if (ty1 == 0) return 0;
A[1] = 1;
k = 0;
for (int i = 1; i <= n; i++){
A[i + 1] = A[i] + rev[i].size();
for (pii j: rev[i]){
B[++k] = j.first;
if (ty2 == 1) Z[k] = j.second;
}
}
for (int i = 1; i <= n + 1; i++) cout << A[i] << " ";
cout << "\n";
for (int i = 1; i <= k; i++) cout << B[i] << " ";
cout << "\n";
if (ty2 == 1){
for (int i = 1; i <= k; i++) cout << Z[i] << " ";
cout << "\n";
}
return 0;
}