
import java.util.*;
public class Main{
public static void main(String [] args)
{
Scanner sc=new Scanner(System.in);
while(sc.hasNext())
{
char[] words=sc.nextLine().toCharArray();
Map<String,Integer> map=new HashMap<>();
for(char c:words)
{
String temp=String.valueOf(c);
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c>='0'&&c<='9')||(c==' ')){
if(map.keySet().contains(temp))
{
map.put(temp,map.get(temp)+1);
}else{
map.put(temp,1);
}
}
}
List<Map.Entry<String,Integer>> list=new ArrayList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String,Integer>>(){
@Override
public int compare(Map.Entry<String,Integer> o1, Map.Entry<String,Integer> o2)
{
if(o1.getValue()<o2.getValue())
{
return 1;
}else{
if(o1.getValue()==o2.getValue())
{
return o1.getKey().compareTo(o2.getKey());
}
else
{
return -1;
}
}
}
});
for(Map.Entry<String,Integer> entry:list)
{
System.out.print(entry.getKey());
}
System.out.println();
}
}
}



class Solution {
public String longestPalindrome(String s) {
if(s.equals(""))
return "";
String res="";
String origin=s;
String reverse=new StringBuilder(s).reverse().toString();
int length=s.length();
int [][] arr=new int[length][length];
int max=0,end=0;
for(int i=0;i<length;i++){
for(int j=0;j<length;j++){
if(origin.charAt(i)==reverse.charAt(j)){
if(i==0 || j==0){
arr[i][j]=1;
}else{
arr[i][j]= arr[i-1][j-1]+1; //动态规划寻找两个字符串的最大公共子串
}
}
if( arr[i][j]>max){ //当前最大子串
String str=origin.substring(i-arr[i][j]+1,i+1); //截取子串
if(isTrue(str)){ //判断是否为回文串
max=str.length(); //记录最大长度
res=str; //记录结果
}
}
}
}
return res;
}
public boolean isTrue(String s){
int len=s.length();
for(int i=0;i<len/2;i++){
if(s.charAt(i)!=s.charAt(len-i-1)){
return false;
}
}
return true;
}
}

import java.util.*;
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0 || s==null)
return 0;
HashMap<Character,Integer> map=new HashMap<>();
int max=0;
int left=0;
for(int i=0;i<s.length();i++){
if(map.containsKey(s.charAt(i))){
left=Math.max(left,map.get(s.charAt(i))+1);//利用map的Key的唯一性,得到无重复子串的最左端
}
map.put(s.charAt(i),i);
max=Math.max(max,i-left+1);
}
return max;
}
}

class Solution {
List<String> list=new ArrayList<>();
String[] str=new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public List<String> letterCombinations(String digits) {
if(digits==null || digits.length()==0)
return list;
String res="";
getString(res,digits,0);
return list;
}
public void getString(String res,String digits,int i){
if(i==digits.length()){
list.add(res);
return;
}
int num=Integer.parseInt(String.valueOf(digits.charAt(i)));
for(int j=0;j<str[num].length();j++){
getString(new String(res+str[num].charAt(j)),digits,i+1);
}
}
}

class Solution {
public boolean isValid(String s) {
if(s==null || s.length()==0){
return true;
}
if(s.length()%2==1)
return false;
Stack <Character> stack=new Stack<>();
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='(' || s.charAt(i)=='[' ||s.charAt(i)=='{'){
if(s.charAt(i)=='(')
stack.push(')');
if(s.charAt(i)=='[')
stack.push(']');
if(s.charAt(i)=='{')
stack.push('}');
}
else{
if(stack.size()>0){
char a=stack.pop();
if(a!=s.charAt(i))
return false;
}
}
}
if(stack.size()!=0)
return false;
else
return true;
}
}