#include using namespace std; int N, T, B, F, C; vector adj[100002]; int P[100002], disc[100002]; set on, off; set> edge; void dfs(int u) { disc[u]=1; off.erase(u); on.insert(u); auto it=on.begin(); while((B>0 || F>0) && it!=on.end()) { if(B>0 && !edge.count({u, *it})) { edge.insert({u, *it}); B--; } if(F>0 && !edge.count({*it, u})) { edge.insert({*it, u}); F--; } ++it; } it=off.begin(); while(C>0 && it!=off.end()) { if(disc[*it] && !edge.count({u, *it})) { edge.insert({u, *it}); C--; } ++it; } for(auto& v: adj[u]) dfs(v); on.erase(u); off.insert(u); } int main() { cin>>T>>B>>F>>C; N=T+1; if(T+B+F+C>=1LL*N*(N-1)) printf("-1\n"); else { printf("%d\n", N); int X=B+F; for(int i=2; i<=N; i++) { if(X