#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

int n;
vector<int> in_seq;               // 输入的入站序列
vector<vector<int>> results;      // 所有合法的出站序列

void backtrack(int in_index, stack<int>& st, vector<int>& out_seq) {
    if (out_seq.size() == n) {
        results.push_back(out_seq);
        return;
    }

    // 尝试入栈
    if (in_index < n) {
        st.push(in_seq[in_index]);
        backtrack(in_index + 1, st, out_seq);
        st.pop();  // 回溯
    }

    // 尝试出栈
    if (!st.empty()) {
        int top = st.top(); st.pop();
        out_seq.push_back(top);
        backtrack(in_index, st, out_seq);
        out_seq.pop_back();
        st.push(top);  // 回溯
    }
}

int main() {
    cin >> n;
    in_seq.resize(n);
    for (int i = 0; i < n; ++i) {
        cin >> in_seq[i];
    }

    stack<int> st;
    vector<int> out_seq;

    backtrack(0, st, out_seq);

    // 排序结果
    sort(results.begin(), results.end());

    // 输出结果
    for (const auto& seq : results) {
        for (int i = 0; i < seq.size(); ++i) {
            if (i > 0) cout << " ";
            cout << seq[i];
        }
        cout << "\n";
    }

    return 0;
}