#include <bits/stdc++.h>
using namespace std;
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
#define Bit(mask , i) ((mask >> i) & 1)
#define fi first
#define se second
#define _LOG2(nl) 31 - __builtin_clz(nl)
#define c_bit(nl) __builtin_popcount(nl)
#define ii pair<long long , int>
#define lll pair<long long , pair<long long , long long>>
#define lii pair<long long , pair<long long , int>>
#define iii pair<int , pair<int , int>>
#define iiii pair<pair<int , int> , pair<int , int>>
#define llll pair<pair<__int128 , __int128> , pair<__int128 , __int128>>
#define li pair<long long , int>
#define db long double
#define onBit(mask , i) (mask | (1 << i))
#define offBit(mask , i) (mask & (~(1 << i)))

const int N = 20;
int n , t , a[N];
long long f[N][N][N][N][N] , F[N][N][2][N][N][N];
vector<int> Ans;

void inp(){
    cin >> n >> t;
    for (int i = 1 ; i <= n ; ++i){
        cin >> a[i];
    }
}

long long dp(int pos , int val , int min1 , int min2 , int _max){
    if (pos > n){
//        cout << pos << " " << val << " " << min1 << " " << min2 << " " << _max << " " << 1 << '\n';
        return f[pos][val][min1][min2][_max] = 1;
    }

    if (f[pos][val][min1][min2][_max] != -1) return f[pos][val][min1][min2][_max];

    long long ans = 0;
    bool bl = 0;
    for (int j = 1 ; j <= n ; ++j){
        int n_min1 = min1 , n_min2 = min2 , n_max = _max;
        n_min2 = min(n_min2 , j);
        if (n_min2 < n_min1) swap(n_min1 , n_min2);
        n_max = max(n_max , j);

        if (n_min1 + n_min2 <= n_max) continue;

        long long tmp = dp(pos + 1 , j , n_min1 , n_min2 , n_max);

        ans += tmp;
    }

//    cout << pos << " " << val << " " << min1 << " " << min2 << " " << _max << " " << ans << '\n';
    return f[pos][val][min1][min2][_max] = ans;
}

void DP(int pos , int val , int min1 , int min2 , int _max){
    if (pos > n){
        return;
    }

    for (int j = 1 ; j <= n ; ++j){
        int n_min1 = min1 , n_min2 = min2 , n_max = _max;
        n_min2 = min(n_min2 , j);
        if (n_min2 < n_min1) swap(n_min1 , n_min2);
        n_max = max(n_max , j);

        if (n_min1 + n_min2 <= n_max) continue;

        if (t > f[pos + 1][j][n_min1][n_min2][n_max]){
            t -= f[pos + 1][j][n_min1][n_min2][n_max];
        }
        else{
            Ans.push_back(j);
            DP(pos + 1 , j , n_min1 , n_min2 , n_max);
            break;
        }
    }
}

long long Dp(int pos , int val , int low ,  int min1 , int min2 , int _max){
    if (pos > n){
        return 1;
    }

    if (F[pos][val][low][min1][min2][_max] != -1) return F[pos][val][low][min1][min2][_max];

    long long ans = 0;
    for (int j = 1 ; j <= n ; ++j){
        if (low && j > a[pos]) break;
        int n_min1 = min1 , n_min2 = min2 , n_max = _max;
        n_min2 = min(n_min2 , j);
        if (n_min2 < n_min1) swap(n_min1 , n_min2);
        n_max = max(n_max , j);

        if (n_min1 + n_min2 <= n_max) continue;

        int n_low = 0;
        if (low && j == a[pos]) n_low = 1;

        ans += Dp(pos + 1 , j , n_low , n_min1 , n_min2 , n_max);
    }

    return F[pos][val][low][min1][min2][_max] = ans;
}

void solve(){
    memset(f , -1 , sizeof f);
    cout << dp(1 , 0 , n + 1 , n + 1 , 0) << '\n';
    DP(1 , 0 , n + 1 , n + 1 , 0);
    for (auto &c : Ans) cout << c << " ";
    cout << '\n';
    memset(F , -1 , sizeof F);
    cout << Dp(1 , 0 , 1 , n + 1 , n + 1 , 0);
}

int main(){
    faster;
    inp();
    solve();
    return 0;
}
