/*
TASK: names
LANG: C++
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <string>
using namespace std;
#define MAXN 2000010

 int I[MAXN];
 int U[MAXN];
 int V[MAXN];
 int d[256];
 char s[MAXN];
 int n;
 int offset;
 string pom,ans,t;

 int cmp (int i,int j)
  {
   return V[i+offset]<V[j+offset];
  }
  
 void make ()
  {
   int i,j,k,l;  
   for (i=1;i<=n;i*=2)
    {
     memcpy(U,V,sizeof(V));
     for (j=1;j<=n;j++)
      {
       k=V[I[j]];
       if (k==j) continue;
       offset=i;
       sort(I+j,I+k+1,cmp);
       U[I[k]]=k;
       for (l=k-1;l>=j;l--)
        if (V[I[l]+offset]!=V[I[l+1]+offset])
         U[I[l]]=l;
          else
           U[I[l]]=U[I[l+1]];
       j=k-1;
      }
     memcpy(V,U,sizeof(U));
    }
  }  

 int i,j,p,q;

 int main ()
  {
   while (gets(&s[1])!=NULL)
    {
     memset(d,0,sizeof(d));
     s[0]='!';
     n=strlen(&s[1]);
     for (i=1;i<=n;i++)
      d[s[i]]++;
     for (i='a';i<='z';i++)  d[i]+=d[i-1];
     V[n+1]=1;
     I[1]=n+1;
     for (i=1;i<=n;i++)      V[i]=d[s[i]]+1;
     for (i=1;i<=n;i++)      I[1+d[s[i]]--]=i;
     make();
     t=ans=(string)(&s[1]);
     for (i=1;i<=n+1;i++)
      I[i]--;      
     for (i=3;i<=min(100,n+1);i++)
      for (j=2;j<i;j++)
       {
         p=min(I[j],I[i]);
         q=max(I[j],I[i]);
         pom=t.substr(p,q-p);
         pom+=t.substr(q);
         pom+=t.substr(0,p);
         if (pom<ans)
          ans=pom;
         pom=t.substr(p,q-p);
         pom+=t.substr(0,p);
         pom+=t.substr(q);         
         if (pom<ans)
          ans=pom;
         pom=t.substr(0,p);
         pom+=t.substr(q);                  
         pom+=t.substr(p,q-p);
         if (pom<ans)
          ans=pom;
         pom=t.substr(q);
         pom+=t.substr(0,p);
         pom+=t.substr(p,q-p);
         if (pom<ans)
          ans=pom;                              
        }
     printf("%s\n",ans.c_str());
    }
   return 0;
  }
