#include <cstdio> 
#include <cassert> 
#include <vector>
#include <set>
#include <algorithm> 
#include <iterator> 
#define CHECK_FOR_CRLF true
#define MIN_WORDS 5
#define MAX_WORDS 5
#define WORD_TOO_LONG(len) (len != 5)
const unsigned int charToBitmask(const char bruh){
	assert(bruh >= 'a' && bruh <= 'z');
	return (1 << (bruh - 'a'));
}
void printBitmask(unsigned int bitmask){
	char start = 'a';
	while(bitmask != 0){
		if(bitmask & 1){
			putchar(start);
		}
		bitmask >>= 1;
		++start;
	}
}
const std::set<unsigned int>* getBitmasks(){
	std::set<unsigned int>* bitmasksPointer = new std::set<unsigned int>;
	std::set<unsigned int>& bitmasks = (*bitmasksPointer);
	unsigned int bitmask = 0;
	unsigned int wordLength = 0;
	bool duplicateLetters = false;
	for(char c = getchar(); c >= 0; c = getchar()){
		if(CHECK_FOR_CRLF && c == '\r'){
			continue;
		}
		if(c == '\n'){
			if(!(WORD_TOO_LONG(wordLength) || duplicateLetters)) bitmasks.insert(bitmask);
			bitmask = 0;
			wordLength = 0;
			duplicateLetters = false;
			continue;
		}
		if((bitmask & charToBitmask(c)) != 0) duplicateLetters = true;
		bitmask |= charToBitmask(c);
		++wordLength;
	}
	return bitmasksPointer;
}
void printBitmasks(const std::vector<unsigned int>& bitmasks){
	for(unsigned int bruh : bitmasks){
		printBitmask(bruh);
		putchar(','); putchar(' ');
	}
	puts("");
}
void recurse(std::vector<unsigned int>& oldBitmasks, std::vector<unsigned int> history, const unsigned int currentBitmask){
	
	if(oldBitmasks.size() + (-(history.size())) + (-MIN_WORDS) <= 0){
		
		if(history.size() >= MIN_WORDS){
			
			printBitmasks(history);
		}
		return;
	
	}else if(history.size() >= MAX_WORDS){
		
		printBitmasks(history);
		return;
	}
	
	std::vector<unsigned int> newBitmasks;
	std::copy_if(oldBitmasks.begin(), oldBitmasks.end(), std::back_inserter(newBitmasks), [¤tBitmask](unsigned int bruh){
		return (bruh & currentBitmask) == 0;
	});
	while(newBitmasks.size() > 0){
		
		
		const unsigned int word = newBitmasks.back(); newBitmasks.pop_back();
		std::vector<unsigned int> newHistory = history;
		newHistory.push_back(word);
		recurse(newBitmasks, newHistory, currentBitmask | word);
	}
}
int main(){
	const std::set<unsigned int>* bitmasksSet = getBitmasks();
	std::vector<unsigned int> bitmasks(bitmasksSet->begin(), bitmasksSet->end());
	delete bitmasksSet;
	recurse(bitmasks, std::vector<unsigned int>(), 0);
	return 0;
}