#include using namespace std; typedef long long ll; typedef long double ld; ll good(int x) { return 1LL * x * (x - 1) / 2; } const int MAXN = 100 * 1000 + 7; vector g[MAXN]; int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); #endif int n, bb, f, c; scanf("%d %d %d %d", &n, &bb, &f, &c); n++; for (int i = 1; i <= n; i++) { int j = n - i + 1; if (good(i) + good(j) >= max(bb, f + n - 1) && 1LL * (i - 1) * (j - 1) >= c) { vector g1, g2; for (int v = 1; v < i; v++) { g[v].push_back(v + 1); g1.push_back(v); } g1.push_back(i); g2.push_back(1); if (i != n) { g[1].push_back(i + 1); for (int v = i + 1; v < n; v++) { g2.push_back(v); g[v].push_back(v + 1); } g2.push_back(n); } for (int a = 0; a < (int)g1.size(); a++) { for (int b = a + 1; b < (int)g1.size(); b++) { if (f == 0 && bb == 0) break; if (f > 0 && b != a + 1) { g[g1[a]].push_back(g1[b]); f--; } if (bb > 0) { g[g1[b]].push_back(g1[a]); bb--; } } } for (int a = 0; a < (int)g2.size(); a++) { for (int b = a + 1; b < (int)g2.size(); b++) { if (f == 0 && bb == 0) break; if (f > 0 && b != a + 1) { g[g2[a]].push_back(g2[b]); f--; } if (bb > 0) { g[g2[b]].push_back(g2[a]); bb--; } } } for (int a = 1; a < (int)g1.size(); a++) { for (int b = 1; b < (int)g2.size(); b++) { if (c == 0) break; if (c > 0) { g[g2[b]].push_back(g1[a]); c--; } } } printf("%d\n", n); for (int v = 1; v <= n; v++) { printf("%d ", (int)g[v].size()); for (int u = 0; u < (int)g[v].size(); u++) { printf("%d ", g[v][u]); } printf("\n"); } return 0; } } printf("-1\n"); }