Problem:
Encryption System

A programmer developed a new encryption system.
However, his system has an issue that
two or more distinct strings are `encrypted' to the same string.

We have a string encrypted by his system.
To decode the original string, we want to enumerate all the candidates of the string before the encryption.
Your mission is to write a program for this task.

The encryption is performed taking the following steps. Given a string that consists only of lowercase letters ('a' to 'z').

Change the first 'b' to 'a'. If there is no 'b', do nothing.

Change the first 'c' to 'b'. If there is no 'c', do nothing.

...

Change the first 'z' to 'y'. If there is no 'z', do nothing.

Input

The input consists of at most 100 datasets.
Each dataset is a line containing an encrypted string.
The encrypted string consists only of lowercase letters, and contains at least 1 and at most 20 characters.

The input ends with a line with a single '#' symbol.

Output

For each dataset,
the number of candidates n of the string before encryption should be printed in a line first,
followed by lines each containing a candidate of the string before encryption.
If n does not exceed 10, print all candidates in dictionary order;
otherwise, print the first five and the last five candidates in dictionary order.

Here, dictionary order is recursively defined as follows.
The empty string comes the first in dictionary order.
For two nonempty strings x = x1 ... xk and y = y1 ... yl,
the string x precedes the string y in dictionary order if

x1 precedes y1 in alphabetical order ('a' to 'z'), or

x1 and y1 are the same character and x2 ... xk precedes y2 ... yl in dictionary order.

Sample Input

enw
abc
abcdefghijklmnopqrst
z
#

Output for the Sample Input

1
fox
5
acc
acd
bbd
bcc
bcd
17711
acceeggiikkmmooqqssu
acceeggiikkmmooqqstt
acceeggiikkmmooqqstu
acceeggiikkmmooqrrtt
acceeggiikkmmooqrrtu
bcdefghijklmnopqrrtt
bcdefghijklmnopqrrtu
bcdefghijklmnopqrssu
bcdefghijklmnopqrstt
bcdefghijklmnopqrstu
0

Solution in JAVA (judge verdict: Memory Limit Exceeded)


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.PriorityQueue;
import java.util.TreeSet;

public class Main {
	InputStream is;

	int __t__ = 1;
	int __f__ = 0;
	int __FILE_DEBUG_FLAG__ = __f__;
	String __DEBUG_FILE_NAME__ = "src/T";

	FastScanner in;
	PrintWriter out;

	TreeSet<String> result = new TreeSet<String>();
//	ArrayList<String> result = new ArrayList<String>();
	
	boolean[] used = new boolean[26];
	String encrypt(char[] s) {
		Arrays.fill(used, false);
		StringBuilder res = new StringBuilder();
		for (int i = 0; i < s.length; i++) {
			if (used[s[i] - 'a']) {
				res.append(s[i]);
			} else {
				used[s[i] - 'a'] = true;
				if (s[i] == 'a')
					res.append(s[i]);
				else 
					res.append((char)(s[i] - 1));
			}
		}

		return res.toString();
	}
	
	void dfs(int at, String base, char[] next) {
		int n = base.length();
		if (at == n) {
			if (base.matches(encrypt(next))) {
				result.add(String.valueOf(next));
			}
			return;
		}
		
		next[at] = base.charAt(at);
		dfs(at + 1, base, next);
		if (base.charAt(at) != 'z') {
			next[at] = (char)(base.charAt(at) + 1);
			dfs(at + 1, base, next);
		}
	}
	
	public void solve() {
		while (true) {
			String t = in.next();
			if (t.matches("#")) break;
			
			result.clear();
			dfs(0, t, new char[t.length()]);
			
			System.out.println(result.size());
			if (result.size() <= 10) {
				for (String s : result) {
					System.out.println(s);
				}
			} else {
				ArrayList<String> list = new ArrayList<String>();
				int sum = 0;
				for (String s : result) {
					if (sum < 5 || sum >= result.size() - 5) {
						list.add(s);
					}
					sum++;
				}
				for (String s : list) {
					System.out.println(s);
				}
			}
		}
	}

	public void run() {
		if (__FILE_DEBUG_FLAG__ == __t__) {
			try {
				is = new FileInputStream(__DEBUG_FILE_NAME__);
			} catch (FileNotFoundException e) {
				// TODO ????????????????????? catch ????????????
				e.printStackTrace();
			}
			System.out.println("FILE_INPUT!");
		} else {
			is = System.in;
		}
		in = new FastScanner(is);
		out = new PrintWriter(System.out);

		solve();
	}

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

	public void mapDebug(int[][] a) {
		System.out.println("--------map display---------");

		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[i].length; j++) {
				System.out.printf("%3d ", a[i][j]);
			}
			System.out.println();
		}

		System.out.println("----------------------------");
		System.out.println();
	}

	public void debug(Object... obj) {
		System.out.println(Arrays.deepToString(obj));
	}

	class FastScanner {
		private InputStream stream;
		private byte[] buf = new byte[1024];
		private int curChar;
		private int numChars;

		public FastScanner(InputStream stream) {
			this.stream = stream;
			//stream = new FileInputStream(new File("dec.in"));

		}

		int read() {
			if (numChars == -1)
				throw new InputMismatchException();
			if (curChar >= numChars) {
				curChar = 0;
				try {
					numChars = stream.read(buf);
				} catch (IOException e) {
					throw new InputMismatchException();
				}
				if (numChars <= 0)
					return -1;
			}
			return buf[curChar++];
		}

		boolean isSpaceChar(int c) {
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}

		boolean isEndline(int c) {
			return c == '\n' || c == '\r' || c == -1;
		}

		int nextInt() {
			return Integer.parseInt(next());
		}

		int[] nextIntArray(int n) {
			int[] array = new int[n];
			for (int i = 0; i < n; i++)
				array[i] = nextInt();

			return array;
		}

		int[][] nextIntMap(int n, int m) {
			int[][] map = new int[n][m];
			for (int i = 0; i < n; i++) {
				map[i] = in.nextIntArray(m);
			}
			return map;
		}

		long nextLong() {
			return Long.parseLong(next());
		}

		long[] nextLongArray(int n) {
			long[] array = new long[n];
			for (int i = 0; i < n; i++)
				array[i] = nextLong();

			return array;
		}

		long[][] nextLongMap(int n, int m) {
			long[][] map = new long[n][m];
			for (int i = 0; i < n; i++) {
				map[i] = in.nextLongArray(m);
			}
			return map;
		}

		double nextDouble() {
			return Double.parseDouble(next());
		}

		double[] nextDoubleArray(int n) {
			double[] array = new double[n];
			for (int i = 0; i < n; i++)
				array[i] = nextDouble();

			return array;
		}

		double[][] nextDoubleMap(int n, int m) {
			double[][] map = new double[n][m];
			for (int i = 0; i < n; i++) {
				map[i] = in.nextDoubleArray(m);
			}
			return map;
		}

		String next() {
			int c = read();
			while (isSpaceChar(c))
				c = read();
			StringBuilder res = new StringBuilder();
			do {
				res.appendCodePoint(c);
				c = read();
			} while (!isSpaceChar(c));
			return res.toString();
		}

		String[] nextStringArray(int n) {
			String[] array = new String[n];
			for (int i = 0; i < n; i++)
				array[i] = next();

			return array;
		}

		String nextLine() {
			int c = read();
			while (isEndline(c))
				c = read();
			StringBuilder res = new StringBuilder();
			do {
				res.appendCodePoint(c);
				c = read();
			} while (!isEndline(c));
			return res.toString();
		}
	}
}