import java.io.*;
import java.util.*;
import java.math.*;

public class hear_ek {

    private final String taskName = "hear";

    private final int MAX_ANSWER = 100000;
    private final int MAX_DIGIT = 50;

    private void addNumber(ArrayList<Integer> v, int num, int f)
    {
        if (num == 0)
            return ;
        if (num >= 100)
            v.add(num - num % 100);
        num %= 100;
        if (num / 10 == 1)
            v.add(num);
        else
        {
            if (num / 10 != 0)
                v.add(num - num % 10);
            if (num % 10 != 0)
                v.add(num % 10);
        }
        if (f != 1)
            v.add(f);
    }

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

    ArrayList < Integer[] > ans = new ArrayList <Integer[]>();
    ArrayList < Integer > nums = new ArrayList < Integer >();
    ArrayList < Integer > cur = new ArrayList < Integer >();

    int length(int num)
    {
        int len = 0;
        while (num != 0)
        {
            ++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.get(i) >= 1000)
            {
                if (part == 0 || lastMult <= nums.get(i))
                    return -1;  
                res += part * nums.get(i);
                lastMult = nums.get(i);
                part = 0;
            }
            else
            {
                if (part != 0 && (length(nums.get(i - 1)) <= length(nums.get(i)) || nums.get(i - 1) / 10 == 1))
                    return -1;
                part += nums.get(i);
            }
        }
        return res + part;
    }

    void brute(int k)
    {
        if (k == nums.size())
        {
            ans.add(cur.toArray(new Integer[0]));
            if (ans.size() > MAX_ANSWER)
                throw new RuntimeException(String.format("Count of answers are greater than %d", MAX_ANSWER));
            return ;
        }

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

    private void run() throws IOException
    {
        Scanner in = new Scanner(new InputStreamReader(new FileInputStream(new File(taskName + ".in"))));
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(taskName + ".out")))));

        String str = in.nextLine();
        int cnt_digit = 0;
        for (String s : str.split("-"))
        {
            int len = s.length();
            if (len < 1 || len > 9)
                throw new RuntimeException(String.format("Length of number (%s) must be in range[1,9]", s));
            cnt_digit += len;
            if (cnt_digit > MAX_DIGIT)
                throw new RuntimeException(String.format("Count of digits are greater than %d", MAX_DIGIT));
            if (s.charAt(0) == '0')
                throw new RuntimeException(String.format("Number (%s) have leading zeroes", s));

            int d = Integer.parseInt(s);
            addNumber(nums, d);
        }

        brute(0);

        out.println(ans.size());
        for (Integer[] list : ans)
        {
            out.print(list[0]);
            for (int j = 1; j < list.length; ++j)
                out.print("-" + list[j]);
            out.println();
        }

        in.close();
        out.close();
    }

    public static void main(String[] args) throws IOException
    {
        new hear_ek().run();
    }
}