#include <iostream>
#include <vector>

using namespace std;

// В качестве первого слагаемого мы можем выбрать любое число K
// из диапазова [1..N]. Тогда останется решить задачу размера
// N-K при условиии что максимальное слагаемое будет не больше
// чем выбранное на данном шаге


namespace {

void PrintArray(const vector<unsigned int> &acc)
{
    for (unsigned int i = 0; i < acc.size(); ++i) {
        if (i) {
            cout << " + ";
        }
        cout << acc[i];
    }
    cout << "\n";
}

void Helper(vector<unsigned int>& acc, unsigned int max, unsigned int remain) {
    if (remain == 0) {
        PrintArray(acc);
        return;
    }

    acc.push_back(0);

    for (auto i = std::min(max, remain); i > 0; --i) {
        acc.back() = i;
        Helper(acc, i, remain - i);
    }

    acc.pop_back();
}

}

void PrintAllPartitions(unsigned int N)
{
    vector<unsigned int> res;
    res.reserve(N);
    Helper(res, N , N);
}


int main()
{
    PrintAllPartitions(4);
    return 0;
}