#include #define pb push_back #define sqr(x) (x)*(x) #define sz(a) int(a.size()) #define reset(a,b) memset(a,b,sizeof(a)) #define oo 1000000007 using namespace std; const int maxn=111111; //Random function double randf() { double base = 0.1; double res = 0; for (int i = 0; i < 15; i++) { res += base * (rand() % 10); base /= 10; } return res; } int randi(int n) { return (int)floor(randf() * n); } typedef pair pii; typedef long long ll; int t,B,F,C,n; vector e[maxn]; bool ok; void solve(){ int b = B, f = F, c = C; ok=1; if(n==1){ ok = (b==0 && f==0 && c==0); return; }else if(n==2){ if(c>0 || f>0 || b>1){ ok = 0; return; } e[1].pb(2); if(b==1) e[2].pb(1); }else{ int y=(n-1)/2, x=n-1-y; for(int i=1; i<=x; ++i) e[i].pb(i+1); e[1].pb(1+x+1); for(int i=1; i0; ++j){ e[i].pb(j); --f; } for(int j=1+x+2; j<=n && f>0; ++j){ e[1].pb(j); --f; } for(int i=1+x+1; i<=n; ++i) for(int j=i+2; j<=n && f>0; ++j){ e[i].pb(j); --f; } //backward for(int i=2; i<=x+1; ++i) for(int j=i-1; j>=1 && b>0; --j){ e[i].pb(j); --b; } for(int i=1+x+1; i<=n; ++i){ for(int j=i-1; j>=1+x+1 && b>0; --j){ e[i].pb(j); --b; } if(b>0){ e[i].pb(1); --b; } } //cross for(int i=1+x+1; i<=n; ++i) for(int j=2; j<=x+1 && c>0; ++j){ e[i].pb(j); --c; } if(b>0 || c>0 || f>0){ ok = 0; } } } void solve2(){ ok=1; for(int i=1; i<=n; ++i) e[i].clear(); int b = B, f = F, c = C; for(int i=1; i0; ++j){ e[i].pb(j); --f; } for(int i=2; i<=n; ++i) for(int j=i-1; j>=1 && b>0; --j){ e[i].pb(j); --b; } if(b>0 || c>0 || f>0){ ok = 0; } } set E[maxn]; int Bx,Fx,Cx,fi[maxn],cnt,arr[maxn],trace[maxn]; void dfs(int u){ fi[u] = ++cnt; arr[cnt] = u; for(auto v : E[u]){ trace[v] = u; for(int i=fi[u]+1; Cx>0 && i<=cnt; ++i){ int k=arr[i]; e[v].pb(k); --Cx; } dfs(v); } for(int i=fi[u]+1; Fx>0 && i<=cnt; ++i){ int v=arr[i]; if(!E[u].count(v)){ e[u].pb(v); --Fx; } } int cur = u; u = trace[u]; while(u>0 && Bx>0){ e[cur].pb(u); --Bx; cur = u; u = trace[u]; } } void solve3(){ ok=1; for(int i=1; i<=n; ++i) e[i].clear(), E[i].clear(); for(int i=2; i<=n; ++i){ int j=randi(i-1)+1; e[j].pb(i); E[j].insert(i); } Bx=B; Fx = F; Cx = C; cnt = 0; dfs(1); if(Bx>0 || Fx>0 || Cx>0){ ok=0; } } int main(){ srand(time(NULL)); // freopen("input.txt","r",stdin); cin>>t>>B>>F>>C; n=t+1; ok = 0; solve(); if(!ok) solve2(); if(!ok){ for(int r=0; r<50; ++r){ solve3(); if(ok) break; } } if(ok){ printf("%d\n",n); for(int i=1; i<=n; ++i){ printf("%d",sz(e[i])); for(int j=0; j