/*
TASK:names
LANG:C++
*/

#include <cstdio>
//#include <conio.h>
#include <algorithm>
using namespace std;

#define MN      2000100

char A[MN];
char B[MN];
int N;

inline bool my_comp(int s1,int e1, int s2,int e2)
{
    int n1=e1-s1+1;
    int n2=e2-s2+1;
    int n= n1+n2;
    char c1,c2;
    
    for (int i=0;i<n;++i) {
        c1= (i<n1) ? A[i+s1] : A[i-n1+s2];
        c2= (i<n2) ? A[i+s2] : A[i-n2+s1];
        
        if (c1!=c2) return c1<c2;
    }
    return false;
}

inline void sol(int a1,int a2,int a3)
{
    char bet=0;
    int i, bp=0;
    
    //printf("%d %d %d\n",a1,a2,a3);
    
    for (i=a1;i<N && i!=a2 && i!=a3; ++i,++bp) {
        if (bet) B[bp]=A[i];
        else {
            if (B[bp] < A[i]) {
                return;
            }
            if (B[bp] > A[i]) {
                B[bp] = A[i];
                bet = 1;
            }
        }
    }

    for (i=a2;i<N && i!=a1 && i!=a3; ++i,++bp) {
        if (bet) B[bp]=A[i];
        else {
            if (B[bp] < A[i]) {
                return;
            }
            if (B[bp] > A[i]) {
                B[bp] = A[i];
                bet = 1;
            }
        }
    }
    
    for (i=a3;i<N && i!=a2 && i!=a1; ++i,++bp) {
        if (bet) B[bp]=A[i];
        else {
            if (B[bp] < A[i]) {
                return;
            }
            if (B[bp] > A[i]) {
                B[bp] = A[i];
                bet = 1;
            }
        }
    }
}

int main()
{
    //freopen("a3.in","r",stdin);
    
    int i,j,k;
    
    for (;gets(A);) {
        N=strlen(A);
        for (i=0;i<=N;++i) B[i]=A[i];
        
        if (N<=3) {
            sort(A,A+N);
            printf("%s\n",A);
            continue;
        }
        
        char min_let='z';
        for (i=0;i<N;++i) {
            if (A[i] < min_let)
                min_let = A[i];
        }
        
        for (i=0;i<N;++i) if (A[i]==min_let) {
            if (i==0) {
                for (j=i+1; j<N; ++j) {
                    for (k=j+1; k<N; ++k) {
                        if (my_comp(j,k-1, k,N-1))
                            sol(i,j,k);
                        else
                            sol(i,k,j);
                    }
                }
            }
            else {
                for (j=i+1; j<N; ++j) {
                    if (my_comp(0,i-1, j,N-1))
                        sol(i,0,j);
                    else
                        sol(i,j,0);
                }
            }
        }
        
        i=N-1;
        for (j=i-1; j>=0; --j) {
            if (A[j+1] != min_let) continue;
            
            for (k=j-1; k>=0; --k) {
                if (my_comp(k+1,j, 0,k))
                    sol(j+1, k+1, 0);
                else 
                    sol(j+1, 0, k+1);
            }
        }
        
        printf("%s\n",B);
    }
    
    //getch();
    return 0;
}
