public static void main(String[] args) throws FileNotFoundException {
    System.out.println("Welcome to the CSE 143 anagram solver.");
    System.out.println("Using dictionary file " + DICTIONARY_FILE + ".");

    // read dictionary into a set
    Scanner input = new Scanner(new File(DICTIONARY_FILE));
    Set<String> dictionary = new TreeSet<String>();
    while (input.hasNextLine()) {
      dictionary.add(input.nextLine());
    }
    dictionary = Collections.unmodifiableSet(dictionary); // read-only

    // create Anagrams object for, well, solving anagrams
    Anagrams solver = new Anagrams(dictionary);

    // get first phrase to solve
    Scanner console = new Scanner(System.in);
    String phrase = getPhrase(console);

    // loop to get/solve each phrase
    while (phrase.length() > 0) {
      System.out.println("All words found in \"" + phrase + "\":");
      Set<String> allWords = solver.getWords(phrase);
      System.out.println(allWords);
      System.out.println();

      System.out.print("Max words to include (Enter for no max)? ");
      String line = console.nextLine().trim();

      long startTime = System.currentTimeMillis();
      if (line.length() > 0) {
        // use a max
        int max = new Scanner(line).nextInt();
        solver.print(phrase, max); // print all anagrams of phrase
      } else {
        // no max
        solver.print(phrase); // print all anagrams of phrase
      }
      long endTime = System.currentTimeMillis();
      System.out.println();

      // 12247 ms elapsed, 2594392 unique LetterInventory object(s) created
      if (TIMING) {
        long elapsed = endTime - startTime;
        int inventories = LetterInventory.getInstanceCount();
        System.out.println(
            elapsed + " ms elapsed, " + inventories + " unique LetterInventory object(s) created");
        LetterInventory.resetInstanceCount();
      }

      // get next phrase to solve
      phrase = getPhrase(console);
    }
  }