#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
typedef long long LL;
typedef pair<int, int> PII;

int n;
int d[4100][4100];
vector<int> ind[31];
int rev[405], ans[405], sub[405];
vector<int> v[3];

int main() {
    //freopen("input.txt", "r", stdin);
    scanf("%d", &n);
    int tot = 0;
    REP(i, n) {
        int x;
        scanf("%d", &x);
        sub[i] = x;
        tot += x;
        ind[x].pb(i);
    }
    memset(d, -1, sizeof d);
    d[0][0] = 0;
    int sum = 1;
    for (int i = 1; i <= 30; ++i) {
        int sz = (int)ind[i].size();
        sum = min(4100, sum + i * sz);
        memset(rev, -1, sizeof rev);
        REP(j, ind[i].size()) rev[ind[i][j]] = j;
        REP(x, sum) REP(y, sum) if (d[x][y] != -1) {
            int z = rev[d[x][y] >> 1] + 1;
            if (z == sz) continue;
            if (x + i < 4100 && (d[x + i][y] == -1 || rev[d[x + i][y] >> 1] > z)) {
                d[x + i][y] = ind[i][z] << 1;
            }
            if (y + i < 4100 && (d[x][y + i] == -1 || rev[d[x][y + i] >> 1] > z)) {
                d[x][y + i] = 1 | (ind[i][z] << 1);
            }
        }
    }
    int bi, bj, best;
    bi = bj = -1;
    best = 12341234;
    REP(i, 4100) REP(j, 4100) if (d[i][j] != -1) {
        int k = tot - i - j;
        int mn = min(min(i, j), k);
        int mx = max(max(i, j), k);
        if (mx - mn < best) {
            best = mx - mn;
            bi = i;
            bj = j;
        }
    }
    REP(i, n) ans[i] = 2;
    for (int i = bi, j = bj; i || j; ) {
        int q = d[i][j] >> 1;
        int w = d[i][j] & 1;
        ans[q] = w;
        if (w) j -= sub[q];
        else i -= sub[q];
    }
    REP(i, n) v[ans[i]].pb(i + 1);
    printf("%d\n", best);
    REP(i, 3) {
        printf("%d", (int)v[i].size());
        for (int x : v[i]) printf(" %d", x);
        printf("\n");
    }
    return 0;
}
