#include <bits/stdc++.h>
#define pb push_back
#define f first
#define s second

typedef long long ll;
typedef long double ld;

using namespace std;

const int N = 1e5 + 10;
const int L = 20;

char s[N];
int n, lg;
int p[L][N], suf[N], lcp[N];
pair<pair<int, int>, int> t[N];

void order(int j){
    sort(t, t + n);
    for(int i = 0; i < n; i++){
        p[j][t[i].s] = i;
        if(i > 0 && t[i].f == t[i - 1].f){
            p[j][t[i].s] = p[j][t[i - 1].s];
        }
    }
}

void build(){
    for(lg = 0; lg == 0 || 1 << (lg - 1) < n; lg++){
        for(int i = 0; i < n; i++){
            if(lg == 0){
                t[i] = {{s[i], -1}, i}; continue;
            }
            int cnt = 1 << (lg - 1);
            t[i] = {{p[lg - 1][i], -1}, i};
            if(i + cnt < n) t[i].f.s = p[lg - 1][i + cnt];
        }
        order(lg);
    }
    lg--;
    for(int i = 0; i < n; i++) suf[p[lg][i]] = i;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    scanf("%s", s);
    n = strlen(s);

    build();

    int k = 0;
    for(int i = 0; i < n; i++){
        if(p[lg][i] == n - 1){
            k = 0; continue;
        }
        int j = suf[p[lg][i] + 1];
        while(i + k < n && j + k < n && s[i + k] == s[j + k]) k++;
        lcp[p[lg][i]] = k;
        if(k > 0) k--;
    }

    int len = * max_element(lcp, lcp + n - 1);
    int ind = max_element(lcp, lcp + n - 1) - lcp;

    for(int i = 0; i < len; i++){
        printf("%c", s[suf[ind] + i]);
    }
    printf("\n");

    



    return 0;
}