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


/**
 * Loads words, and forms structure so that anagrams can be easily found
 *
 * @author Robert C. Duvall
 */
public class Analist
{
    //////////////////////////////////////////////////////////////
    // constants
    public static final String PRINT_SEPARATOR = "\n";

    //////////////////////////////////////////////////////////////
    // state
    // map word to set of words with same letters
    private Map myAnagrams;


    //////////////////////////////////////////////////////////////
    // constructors
    /**
     * Create an empty Analist.
     */
    public Analist ()
    {
        myAnagrams = new TreeMap();
    }

    
    //////////////////////////////////////////////////////////////
    // public methods
    /**
     * Load words used for finding anagrams
     * @param input source of words for finding anagrams
     */
    public void insert (Scanner input)
    {
        while (input.hasNext())
        {
            insert(input.nextString());
        }
    }

    /**
     * Load a single word used for finding anagrams
     * @param word word to be used as anagram
     */
    public void insert (String word)
    {
        String key = canonicalize(word);
        Set value = (Set)(myAnagrams.get(key));
        if (value == null)
        {
            value = new TreeSet();
            myAnagrams.put(key, value);
        }
        value.add(word);
    }

    /**
     * Convert all anagrams found into string
     */
    public String toString ()
    {
        String result = "";

        Iterator iter = iterator();
        while (iter.hasNext())
        {
            result += iter.next() + PRINT_SEPARATOR;
        }

        return result;
    }

    /**
     * Allow users to move through collection of anagrams
     */
    public Iterator iterator ()
    {
        return new Iterator(myAnagrams);
    }


    //////////////////////////////////////////////////////////////
    // private methods
    /**
     *  Make a key from given word.
     *  @return sorted version of word
     */
    private String canonicalize (String word)
    {
        char[] tmp = word.toCharArray();
        Arrays.sort(tmp);
        return new String(tmp);
    }


    //////////////////////////////////////////////////////////////
    // Main
    // Allow this class to be run directly by Java.
    // Read any number of word lists from the command line,
    // and print any anagrams found within them
    public static void main (String[] args)
    {
        Analist anagrams = new Analist();

        for (int k = 0; k < args.length; k++)
        {
            Scanner input = new Scanner(new File(args[k]));
            anagrams.insert(input);
            input.close();
        }

        System.out.print(anagrams);
    }
}
