#include <stdio.h>
#include <ctype.h>

extern void *malloc ();
extern void *realloc ();

long getword ();

#define MAXWORD 26
int list[MAXWORD];
int lp;

struct list {
	struct list *next;
	char *word;
};

struct word {
	long mask;
	struct list *list;
} *w;
int wp;
int wsize;

char wordbuf[BUFSIZ];

char *letters = "qxjzvwfkbyhpmgcdultnoriase";

int cmp (ap, bp)
struct word *ap, *bp;
{
	char *p;
	long a = ap->mask, b = bp->mask;

	for (p = letters; *p; p++)
	{
		long m = 1L << (*p - 'a');

		if ((a & m) != (b & m))
			if ((a & m) != 0)
				return -1;
			else
				return 1;
	}
	return 0;
}

void *
newmem (p, size)
void *p;
int size;
{
	if (p)
		p = realloc (p, size);
	else
		p = malloc (size);
	if (p == NULL) {
		fprintf (stderr, "Out of memory\n");
		exit (1);
	}
	return p;
}

char *
dupstr (s)
char *s;
{
	char *p = newmem ((void *)NULL, strlen (s) + 1);

	strcpy (p, s);
	return p;
}

main (argc, argv)
int argc;
char **argv;
{
	long m;
	int i, j;

	while ((m = getword (stdin)) != 0)
	{
		if (wp >= wsize)
		{
			wsize += 1000;
			w = newmem (w, wsize * sizeof (struct word));
		}
		w[wp].mask = m;
		w[wp].list = newmem ((void *)NULL, sizeof (struct list));
		w[wp].list->word = dupstr (wordbuf);
		w[wp].list->next = (struct list *)NULL;
		wp++;
	}
	qsort (w, wp, sizeof (struct word), cmp);
	for (i = 1, j = 1; j < wp; j++)
	{
		if (w[j].mask == w[i - 1].mask) {
			w[j].list->next = w[i - 1].list;
			w[i - 1].list = w[j].list;
		} else
			w[i++] = w[j];
	}
	wp = i;
	pangram (0L, 0, letters);
	exit (0);
}

pangram (sofar, min, lets)
long sofar;
int min;
char *lets;
{
	register int i;
	register long must;

	if (sofar == 0x3ffffff) {
		print ();
		return;
	}
	for (; *lets; lets++)
		if ((sofar & (1 << (*lets - 'a'))) == 0)
			break;
	must = 1 << (*lets - 'a');
	for (i = min; i < wp; i++)
	{
		if (w[i].mask & sofar)
			continue;
		if ((w[i].mask & must) == 0)
			continue;
		list[lp++] = i;
		pangram (w[i].mask | sofar, i + 1, lets);
		--lp;
	}
}

long
getword (fp)
FILE *fp;
{
	long mask, m;
	char *p;
	char c;

	while (fgets (wordbuf, sizeof (wordbuf), fp) != NULL) {
		p = wordbuf;
		mask = 0L;
		while ((c = *p++) != '\0') {
			if (!islower (c))
				break;
			m = 1L << (c - 'a');
			if ((mask & m) != 0)
				break;
			mask |= m;
		}
		if (c == '\n')
			p[-1] = c = '\0';
		if (c == '\0' && mask)
			return mask;
	}
	return 0;
}

print ()
{
	int i;

	for (i = 0; i < lp; i++)
	{
		struct word *p = &w[list[i]];
		struct list *l;

		if (p->list->next == NULL)
			printf ("%s", p->list->word);
		else {
			printf ("(");
			for (l = p->list; l; l = l->next) {
				printf ("%s", l->word);
				if (l->next)
					printf (" ");
			}
			printf (")");
		}
		if (i != lp - 1)
			printf (" ");
	}
	printf ("\n");
	fflush (stdout);
}
