#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker, "/STACK:256000000") using namespace std; typedef long long int int64; typedef long double double80; const int INF = (1 << 29) + 5; const int64 LLINF = (1ll << 59) + 5; const int MOD = 1000 * 1000 * 1000 + 7; int n; vector graph[228228]; int t, b, f, c; int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); scanf("%d%d%d%d", &t, &b, &f, &c); int64 fr, sc; int64 cnt_b, cnt_f, cnt_c; int cnt1, cnt2, n; for (int i = 0; i <= t; ++i) { fr = i; sc = t - i; cnt_c = fr * sc; cnt_f = fr * (fr + 1) / 2 + sc * (sc + 1) / 2 - fr - sc; cnt_b = fr * (fr + 1) / 2 + sc * (sc + 1) / 2; if (c <= cnt_c && f <= cnt_f && b <= cnt_b) { cnt1 = fr + 1; cnt2 = fr + 2; n = t + 1; for (int i = 1; i < cnt1; ++i) { graph[i].push_back(i + 1); } graph[1].push_back(cnt2); for (int i = cnt2; i < n; ++i) { graph[i].push_back(i + 1); } for (int i = cnt2; i <= n; ++i) { for (int j = 2; j <= cnt1 && c; ++j) { graph[i].push_back(j); --c; } } for (int i = 1; i <= cnt1; ++i) { for (int j = i + 1; j <= cnt1 && b; ++j) { graph[j].push_back(i); --b; } } for (int i = cnt2; i <= n; ++i) { for (int j = i + 1; j <= n && b; ++j) { graph[j].push_back(i); --b; } } for (int j = cnt2; j <= n && b; ++j) { graph[j].push_back(1); --b; } for (int i = 1; i <= cnt1; ++i) { for (int j = i + 2; j <= cnt1 && f; ++j) { graph[i].push_back(j); --f; } } for (int i = cnt2; i <= n; ++i) { for (int j = i + 2; j <= n && f; ++j) { graph[i].push_back(j); --f; } } for (int j = cnt2 + 1; j <= n && f; ++j) { graph[1].push_back(j); --f; } printf("%d\n", n); for (int i = 1; i <= n; ++i) { printf("%d ", (int)graph[i].size()); for (int j = 0; j < graph[i].size(); ++j) { printf("%d ", graph[i][j]); } printf("\n"); } return 0; } } printf("-1\n"); fclose(stdin); fclose(stdout); return 0; }