#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>

#define TASKNAME "hear"

using std::vector;

const int MAX_ANSWER = 100000;
const int MAX_DIGIT = 50;

void addNumber(vector <int> & v, int num, int f)
{
    if (num == 0)
        return ;
    if (num >= 100)
        v.push_back(num - num % 100);
    num %= 100;
    if (num / 10 == 1)
        v.push_back(num);
    else
    {
        if (num / 10 != 0)
            v.push_back(num - num % 10);
        if (num % 10 != 0)
            v.push_back(num % 10);
    }
    if (f != 1)
        v.push_back(f);
}

void addNumber(vector <int> & v, int num)
{
    for (int i = 1000000; i >= 1; i /= 1000)
    {
        addNumber(v, num / i, i);
        num %= i;
    }
}

vector < vector <int> > ans;
vector < int > nums;
vector < int > cur;

int length(int num)
{
    int len = 0;
    while (num)
    {
        ++len;
        num /= 10;
    }
    return len;
}

int getNumber(int l, int r)
{
    int res = 0;
    int part = 0;
    int lastMult = 1000000000;
    for (int i = l; i <= r; ++i)
    {
        if (nums[i] >= 1000)
        {
            if (part == 0 || lastMult <= nums[i])
                return -1;  
            res += part * nums[i];
            lastMult = nums[i];
            part = 0;
        }
        else
        {
            if (part != 0 && length(nums[i - 1]) <= length(nums[i]))
                return -1;
            part += nums[i];
        }
    }
    return res + part;
}

void brute(int k)
{
    if (k == int(nums.size()))
    {
        ans.push_back(cur);
        if ((int)ans.size() > MAX_ANSWER)
        {
            printf("Count of answers are greater than %d\n", MAX_ANSWER);
            exit(42);
        }
        return ;
    }

    for (int l = k; l < int(nums.size()); ++l)
    {
        int curNum = getNumber(k, l);
        if (curNum == -1)
            break;
        cur.push_back(curNum);
        brute(l + 1);
        cur.pop_back();
    }
}

char s[20];

bool eoln(char & ch)
{
#if LINUX
    return ch == 10;
#else
    return (ch == 13 && scanf("%c", &ch) == 1 && ch == 10);
#endif
}

int main()
{
    freopen(TASKNAME ".in", "rb", stdin);
    freopen(TASKNAME ".out", "w", stdout);

    int cnt_digit = 0;
    while (1)
    {
        scanf("%[0-9]", s);
        int len = strlen(s);
        if (len < 1 || len > 9)
        {
            printf("Length of number (%s) must be in range[1,9]\n", s);
            return 42;
        }
        cnt_digit += len;
        if (cnt_digit > MAX_DIGIT)
        {
            printf("Count of digits are greater than %d\n", MAX_DIGIT);
            return 42;
        }
        if (s[0] == '0')
        {
            printf("Number (%s) have leading zeroes\n", s);
            return 42;
        }

        int d;
        sscanf(s, "%d", &d);
        addNumber(nums, d);

        char ch;
        scanf("%c", &ch);
        if (ch == '-')
            continue;

        if (!eoln(ch))
        {
            printf("Expected EOLN\n");
            return 42;
        }
        if (scanf("%c", &ch) != EOF)
        {
            printf("Expected EOF\n");
            return 42;
        }
        break;
    }

    brute(0);

    printf("%d\n", int(ans.size()));
    for (int i = 0; i < int(ans.size()); ++i)
    {
        printf("%d", ans[i][0]);
        for (int j = 1; j < int(ans[i].size()); ++j)
            printf("-%d", ans[i][j]);
        printf("\n");
    }

    return 0;
}