#include <climits>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>

std::vector<std::string> do_split(const std::string& original, const std::vector<bool>& split)
{
    if(original.size() != split.size() + 1)
        throw std::invalid_argument("Mismatching sizes of string and split");

    std::vector<std::string> result;
    auto beg = original.cbegin();
    for(size_t i = 0; i < split.size(); ++i) {
        if(split[i]) {
            auto end = std::next(original.cbegin(), i + 1);
            result.emplace_back(beg, end);
            beg = end;
        }
    }
    result.emplace_back(beg, original.cend());
    return result;
}

int main()
{
    using split_t = unsigned;
    constexpr size_t limit = sizeof(split_t) * CHAR_BIT;
    std::string input;
    std::cin >> input;
    auto size = input.size();
    if(size > limit)
        throw std::range_error("Line is too long, maximum: " + std::to_string(limit));
    std::cout << "Generating splits:\n";
    std::vector<bool> split_v(size - 1);
    for(split_t split = 0; split < (1u << (size - 1)); ++split) { //Generating all splits
        //Stuffing those to the bool vector for fast extraction
        for(size_t i = 0; i < size; ++i)
            split_v[i] = (split & 1u << i);
        //Extracting current split result
        std::vector<std::string> res = do_split(input, split_v);
        //Output
        for(const auto& s: res)
            std::cout << s << ' ';
        std::cout << '\n';
    }
}