import java.util.ArrayList;
import java.io.*;

class Scrabble
{
	public static void main(String[] args)
	{
		int maxNum = -1;

		if( args.length >= 2 )
		{
			try
			{
				maxNum = Integer.parseInt( args[1] );
			}
			catch( NumberFormatException e )
			{
			}
		}

		if( args.length >= 1 )
		{
			String letters = args[0];
			ArrayList list = getWordsYouCanMakeFrom(letters);
			sort(list);

			System.out.println( "You can make " + list.size() + " words out of \"" + letters + "\"." );
			printStringArrayList(list, maxNum);
		}
		else
		{
			System.out.println( "No letters supplied!" );
			System.out.println( "Usage: <letters> <maxresults> (set to -1 to show all)" );

		}
	}

	// Print out an ArrayList of Strings.
	static void printStringArrayList(ArrayList list, int maxNum )
	{
		for (int i = 0; i < list.size(); i++)
		{
			System.out.println( (i+1) + "\t" + (String)list.get(i));

			if( i == maxNum-1 )
				return;
		}
	}

	// Sort a list of words, largest to smallest.
	static void sort(ArrayList words)
	{
		ArrayList sorted = new ArrayList();

		for (int i = 30; i >= 0; i--)
			for (int j = 0; j < words.size(); j++)
			{
				String word = (String)words.get(j);
				if (word.length() == i)
					sorted.add(word);
			}

		words.clear();

		for (int i = 0; i < sorted.size(); i++)
			words.add(sorted.get(i));
	}

	static ArrayList getWordsYouCanMakeFrom(String letters)
	{
		ArrayList dictionary = getDictionary("words.txt");
		ArrayList words = new ArrayList();

		for (int i = 0; i < dictionary.size(); i++)
			if (canMakeWordFromLetters((String)dictionary.get(i), letters))
				words.add(dictionary.get(i));

		return words;
	}

	public static boolean canMakeWordFromLetters(String word, String letters)
	{
		CharBag bag = new CharBag(letters);
		return bag.removeLettersFromBag(word);
	}

	public static ArrayList getDictionary(String textFileName)
	{
		ArrayList dictionary = new ArrayList();

		try
		{
			FileInputStream fis = new FileInputStream(textFileName);

			String s = "";
			int c;

			do
			{
				c = (char)fis.read();
				char ch = (char)c;

				if (c == '\r')
				{
					dictionary.add(s);
					s = "";
				}
				else if (c == '\n')
				{
				}
				else if (c == 65535)
				{
					break;
				}
				else
				{
					s += (char)c;
				}
			} while (c != -1);

		}
		catch (Exception e)
		{
		}

		return dictionary;
	}
}

class CharBag
{
	private ArrayList contents = new ArrayList();

	CharBag(String chars)
	{
		for (int i = 0; i < chars.length(); i++)
			contents.add(new Character(chars.charAt(i)));
	}

	public boolean removeLettersFromBag(String removeString)
	{
		for (int i = 0; i < removeString.length(); i++)
		{
			Character removeChar = new Character(removeString.charAt(i));

			if (!removeCharacterFromBag(removeChar))
				return false;
		}

		return true;
	}

	public boolean removeCharacterFromBag(Character removeChar)
	{
		for (int i = 0; i < contents.size(); i++)
		{
			Character currentChar = ((Character)contents.get(i));

			if (currentChar.compareTo(removeChar) == 0)
			{
				contents.remove(i);
				return true;
			}
		}

		return false;
	}
}
