#include "bits/stdc++.h" using namespace std; #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) #define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) #define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) static const int INF = 0x3f3f3f3f; static const long long INFL = 0x3f3f3f3f3f3f3f3fLL; typedef vector vi; typedef pair pii; typedef vector > vpii; typedef long long ll; template static void amin(T &x, U y) { if (y < x) x = y; } template static void amax(T &x, U y) { if (x < y) x = y; } int main() { int T; int B; int F; int C; while (~scanf("%d%d%d%d", &T, &B, &F, &C)) { int N = T + 1; int L = N - 1, R = 0; while (L > R && L * R < C) --L, ++R; vector g(N); rep(i, L) g[i].push_back(i + 1); rep(i, R) g[i == 0 ? 0 : L + 1 + i - 1].push_back(L + 1 + i); int remB = B, remF = F, remC = C; rep(i, N) { if (i < L + 1) { rep(j, i) { if (remB == 0) break; --remB; g[i].push_back(j); } reu(j, i + 2, N) if(j < L + 1) { if (remF == 0) break; --remF; g[i].push_back(j); } } if (i == 0 || L + 1 <= i) { rep(j, i) if (j == 0 || L + 1 <= j) { if (remB == 0) break; --remB; g[i].push_back(j); } reu(j, i + 2, N) if(L + 1 <= j) { if (remF == 0) break; --remF; g[i].push_back(j); } } } reu(i, L + 1, N) { reu(j, 1, L + 1) { if (remC == 0) break; --remC; g[i].push_back(j); } } if (remF != 0 || remB != 0 || remC != 0) { puts("-1"); } else { printf("%d\n", N); rep(i, N) { printf("%d", (int)g[i].size()); for (int j : g[i]) printf(" %d", j + 1); puts(""); } } } return 0; }