import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
class Printer
{
public static <E> void print(List<List<E>> permutations)
{
int n = 0;
for (List<E> permutation : permutations)
{
System.out.print(++n + ":");
for (E element : permutation)
{
System.out.print(" " + element);
}
System.out.println();
}
}
}
class Permuter
{
public static <E> List<List<E>> getPermutationsOf(Set<E> set)
{
ArrayList list = new ArrayList(set.size());
for (E element : set) list.add(element);
return getPermutationsOf(list, 0);
}
public static <E> List<List<E>> getPermutationsOf(List<E> list)
{
return getPermutationsOf(list, 0);
}
private static <E> List<List<E>> getPermutationsOf(List<E> list, int headIndex)
{
final int permutationLength = list.size() - headIndex;
List<List<E>> permutations = new ArrayList<List<E>>();
if (permutationLength > 0)
{
E theHeadElement = list.get(headIndex);
List<List<E>> permutationsOfTail = getPermutationsOf(list, headIndex + 1);
for (List<E> permutationOfTail : permutationsOfTail)
{
final int lastIndex = permutationLength - 1;
for (int putHeadAtIndex = 0; putHeadAtIndex <= lastIndex; putHeadAtIndex++)
{
List<E> newPermutation = new ArrayList<E>(permutationLength);
for (int i = 0; i < lastIndex; i++)
{
E nextTailElement = permutationOfTail.get(i);
if (putHeadAtIndex == i)
{
newPermutation.add(theHeadElement);
}
newPermutation.add(nextTailElement);
}
if (putHeadAtIndex == lastIndex)
{
newPermutation.add(theHeadElement);
}
permutations.add(newPermutation);
}
}
}
else
{
// There is one way to arrange no elements.
permutations.add(new ArrayList<E>());
}
return permutations;
}
}
public class ListPermutations
{
public static void main(String[] args)
{
SortedSet<String> set = new TreeSet<String>();
for (String s : args) set.add(s);
Printer.print(Permuter.getPermutationsOf(set));
}
}