#include<bits/stdc++.h>

#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")

#define int long long

#define pii pair<int,int>
#define ii int,int
#define fi first
#define se second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define umap unordered_map
#define BIT(mask, i) ((mask >> i)&1)
#define ALL(c) c.begin(), c.end()

using namespace std;

mt19937 rd(chrono::high_resolution_clock::now().time_since_epoch().count());
int rand(int l, int r){
    return  l + rd()*rd()%(r-l+1);
}

const int N = 1e6+7;
const int M = 1e3+3;
const int MOD = 1e9+7;
const int inf = 3e18;

int n, f, visited[11], x[11];

// Sinh các hoán vị của 1, 2, 3, ... ,n

// mảng x có tác dụng là để lưu hoán vị
// mảng visited có tác dụng để xét các số chưa xuất hiện trong hoán vị

void backtracking(int i){
    for(int j = 1; j <= n; j++){
        if(visited[j] == false){ // j chưa xuất hiện trong hoán vị
            visited[j] = true;
            x[i] = j;
            if(i == n){ // đã đủ 1 hoán vị
                // xét hoán vị có thỏa mãn đề hay không
                vector<int> v;
                for(int k = 1; k <= n; k++){
                    v.push_back(x[k]);
                }

                while(v.size() != 1){
                    vector<int> u;
                    for(int k = 1; k < v.size(); k++){
                        u.push_back(v[k] + v[k-1]);
                    }
                    v = u;
                }
                if(v[0] == f){
                    for(int k = 1; k <= n; k++){
                        cout << x[k] << ' ';
                    }
                    return;
                }   
            }
            else backtracking(i + 1); // i chưa đủ 1 hoán vị thì thêm 1 phần tử nữa
                                      // để đủ 1 hoán vị
            visited[j] = false;
        }
    }

}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> f;
    backtracking(1);
}
