#include <iostream>
#include <vector>
#include <utility>
using namespace std;

constexpr int maxn = (1 << 18) + 10;

int n, sz[maxn] = {};
vector<int> fii[maxn], buf[maxn] = {};

int get_size(int curr = 1){
    for(auto next : fii[curr]) sz[curr] += get_size(next);
    return ++sz[curr];
}

void solve(int curr = 1, vector<int>* ret = buf){
    ret[sz[curr]].push_back(curr);
    if(fii[curr].size() == 1) solve(fii[curr][0], ret);
    else if(fii[curr].size() == 2){
        int f1 = fii[curr][0], f2 = fii[curr][1];
        if(sz[f1] > sz[f2]) swap(f1, f2);

        for(int i = sz[f2] + 1; i < sz[curr]; ++i)
            ret[i].push_back(f2);

        solve(f1, ret + sz[f2]);
        solve(f2, ret);
    }
}

int main(){
//  ios_base::sync_with_stdio(false);
//  cin.tie(nullptr);
    cin >> n;
    n = (1 << n);

    for(int i = 2, x; i <= n; ++i){
        cin >> x;
        fii[x].push_back(i);
    }

    get_size();
    solve();

    cout << n << '\n';
    for(int i = 1; i <= n; ++i){
        cout << buf[i].size() << ' ';
        for(auto y : buf[i]) cout << y << ' ';
        cout << '\n';
    }
}
