#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int p = 31;
const int MOD = 1e9 + 9277;
const int N = 1e6 + 5;
int n;
string s;
int p_pow[2 * N], h[2 * N];
void precompute() {
p_pow[0] = 1;
for (int i = 1; i <= 2 * n; i++) {
p_pow[i] = 1ll * p_pow[i - 1] * p % MOD;
}
h[0] = 0;
for (int i = 1; i <= 2 * n; i++) {
h[i] = (1ll * h[i - 1] * p + (s[i] - 'a' + 1)) % MOD;
}
}
int getHash(int l, int r) {
return (h[r] - 1ll * h[l - 1] * p_pow[r - l + 1] % MOD + MOD) % MOD;
}
// So sánh thứ tự từ điển của 2 xâu độ dài n bắt đầu tại vị trí i và vị trí j của xâu s
// -1: <
// 0: =
// 1: >
int compare(int i, int j) {
int l = 1, r = n, lcp = 0; // lcp (longest common prefix): độ dài tiền tố chung dài nhất
while (l <= r) {
int mid = (l + r) >> 1;
if (getHash(i, i + mid - 1) == getHash(j, j + mid - 1)) {
lcp = mid;
l = mid + 1;
}
else {
r = mid - 1;
}
}
if (lcp == n) return 0;
if (s[i + lcp] < s[j + lcp]) return -1;
return 1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> s;
n = s.size();
// Sau khi nhân đôi xâu s thì mỗi xâu con độ dài n của xâu s lúc này
// tương ứng với một xâu nhận được sau khi thực hiện thao tác shift trên xâu s ban đầu
s = ' ' + s + s;
precompute();
// vị trí bắt đầu của xâu có thứ tự từ điển nhỏ nhất
int min_pos = 1;
for (int i = 1; i <= n; i++) {
if (compare(i, min_pos) == -1) min_pos = i;
}
for (int i = min_pos; i <= min_pos + n - 1; i++) cout << s[i];
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IHAgPSAzMTsgCmNvbnN0IGludCBNT0QgPSAxZTkgKyA5Mjc3OyAKY29uc3QgaW50IE4gPSAxZTYgKyA1OyAKCmludCBuOyAKc3RyaW5nIHM7ICAKCmludCBwX3Bvd1syICogTl0sIGhbMiAqIE5dOyAKCnZvaWQgcHJlY29tcHV0ZSgpIHsKCXBfcG93WzBdID0gMTsgCglmb3IgKGludCBpID0gMTsgaSA8PSAyICogbjsgaSsrKSB7CgkJcF9wb3dbaV0gPSAxbGwgKiBwX3Bvd1tpIC0gMV0gKiBwICUgTU9EOyAKCX0KCgloWzBdID0gMDsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gMiAqIG47IGkrKykgewoJCWhbaV0gPSAoMWxsICogaFtpIC0gMV0gKiBwICsgKHNbaV0gLSAnYScgKyAxKSkgJSBNT0Q7IAoJfQp9CgppbnQgZ2V0SGFzaChpbnQgbCwgaW50IHIpIHsKCXJldHVybiAoaFtyXSAtIDFsbCAqIGhbbCAtIDFdICogcF9wb3dbciAtIGwgKyAxXSAlIE1PRCArIE1PRCkgJSBNT0Q7IAp9CgovLyBTbyBzw6FuaCB0aOG7qSB04buxIHThu6sgxJFp4buDbiBj4bunYSAyIHjDonUgxJHhu5kgZMOgaSBuIGLhuq90IMSR4bqndSB04bqhaSB24buLIHRyw60gaSB2w6AgduG7iyB0csOtIGogY+G7p2EgeMOidSBzCi8vIC0xOiA8Ci8vIDA6ID0gCi8vIDE6ID4gCmludCBjb21wYXJlKGludCBpLCBpbnQgaikgewoJaW50IGwgPSAxLCByID0gbiwgbGNwID0gMDsgLy8gbGNwIChsb25nZXN0IGNvbW1vbiBwcmVmaXgpOiDEkeG7mSBkw6BpIHRp4buBbiB04buRIGNodW5nIGTDoGkgbmjhuqV0IAoJd2hpbGUgKGwgPD0gcikgewoJCWludCBtaWQgPSAobCArIHIpID4+IDE7IAoJCWlmIChnZXRIYXNoKGksIGkgKyBtaWQgLSAxKSA9PSBnZXRIYXNoKGosIGogKyBtaWQgLSAxKSkgewoJCQlsY3AgPSBtaWQ7ICAKCQkJbCA9IG1pZCArIDE7IAoJCX0KCQllbHNlIHsKCQkJciA9IG1pZCAtIDE7IAoJCX0KCX0KCglpZiAobGNwID09IG4pIHJldHVybiAwOyAgIAoJaWYgKHNbaSArIGxjcF0gPCBzW2ogKyBsY3BdKSByZXR1cm4gLTE7ICAKCXJldHVybiAxOyAKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IHM7ICAKCW4gPSBzLnNpemUoKTsgCgoJLy8gU2F1IGtoaSBuaMOibiDEkcO0aSB4w6J1IHMgdGjDrCBt4buXaSB4w6J1IGNvbiDEkeG7mSBkw6BpIG4gY+G7p2EgeMOidSBzIGzDumMgbsOgeSAKCS8vIHTGsMahbmcg4bupbmcgduG7m2kgbeG7mXQgeMOidSBuaOG6rW4gxJHGsOG7o2Mgc2F1IGtoaSB0aOG7sWMgaGnhu4duIHRoYW8gdMOhYyBzaGlmdCB0csOqbiB4w6J1IHMgYmFuIMSR4bqndSAKCXMgPSAnICcgKyBzICsgczsgICAKCglwcmVjb21wdXRlKCk7IAoKCS8vIHbhu4sgdHLDrSBi4bqvdCDEkeG6p3UgY+G7p2EgeMOidSBjw7MgdGjhu6kgdOG7sSB04burIMSRaeG7g24gbmjhu48gbmjhuqV0CglpbnQgbWluX3BvcyA9IDE7ICAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWlmIChjb21wYXJlKGksIG1pbl9wb3MpID09IC0xKSBtaW5fcG9zID0gaTsgCgl9CQoKCWZvciAoaW50IGkgPSBtaW5fcG9zOyBpIDw9IG1pbl9wb3MgKyBuIC0gMTsgaSsrKSBjb3V0IDw8IHNbaV07IAp9