import sys
def backtracking(target,loc,tem,ans,set1):
    if len(tem)==len(target):
        s=''.join(tem)
        ans.append(s)
    for i in range(len(target)):
        if target[i] in set1:
            tem.append(target[i])
            set1.discard(target[i])
            backtracking(target,i+1,tem,ans,set1)
            set1.add(target[i])
            tem.pop()
if __name__=='__main__':
    for line in sys.stdin:
        target=list(line.strip())
        tem=[]
        ans=[]
        set1=set(target)
        backtracking(target,0,tem,ans,set1)
        ans=sorted(ans)
        for elem in ans:
            print(elem)

回溯算法遍历“叶子节点”,相邻层之间通过哈希表进行剪枝,压栈前和弹栈后进行维护哈希表