/// sa&lcp by muoii
#include <bits/stdc++.h>
using namespace std;
#define tag "spoj"
#define maxn 0
#define module 0
#define oo 1000000007LL
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
int n;
string s;
vector<int> sa,rak,tmp,lcp;
int gap;
bool sufcmp(const int &x,const int &y){
if (rak[x]!=rak[y]) return rak[x]<rak[y];
return (x+gap<=n && y+gap<=n) ? rak[x+gap]<rak[y+gap] : x>y;
}
void buildSA(){
sa=rak=tmp=vector<int>(n+1);
for(int i=1;i<=n;i++) sa[i]=i,rak[i]=s[i],tmp[i]=0;
for(gap=1;gap<=n && (gap==1 || rak[sa[n]]<n);gap<<=1)
{
sort(sa.begin()+1,sa.begin()+n+1,sufcmp);
for(int i=1;i<=n;i++) tmp[sa[i]] = tmp[sa[i-1]] + sufcmp(sa[i-1],sa[i]);
for(int i=1;i<=n;i++) rak[i]=tmp[i];
}
}
void buildLCP(){
lcp=vector<int>(n+1);
for(int i=1,k=0;i<=n;i++)
if(rak[i]>1)
{
for(int j=sa[rak[i]-1];s[i+k]==s[j+k];) ++k;
lcp[rak[i]]=k;
k-=(k>0);
}
}
int main()
{
#ifdef dmdd
freopen(tag".inp","r",stdin); freopen(tag".out","w",stdout);
#endif // dmdd
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>s;n=s.size();s="$"+s;
buildSA();buildLCP();
for(int i=1;i<=n;i++) cout<<sa[i]<<" : "<<lcp[i]<<"\n";
return 0;
}
Ly8vIHNhJmxjcCBieSBtdW9paQoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgdGFnICJzcG9qIgojZGVmaW5lIG1heG4gMAojZGVmaW5lIG1vZHVsZSAwCiNkZWZpbmUgb28gMTAwMDAwMDAwN0xMCi8vLz4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+CgppbnQgbjsKc3RyaW5nIHM7CnZlY3RvcjxpbnQ+IHNhLHJhayx0bXAsbGNwOwppbnQgZ2FwOwoKYm9vbCBzdWZjbXAoY29uc3QgaW50ICZ4LGNvbnN0IGludCAmeSl7CgogICAgaWYgKHJha1t4XSE9cmFrW3ldKSByZXR1cm4gcmFrW3hdPHJha1t5XTsKICAgIHJldHVybiAoeCtnYXA8PW4gJiYgeStnYXA8PW4pID8gcmFrW3grZ2FwXTxyYWtbeStnYXBdIDogeD55Owp9Cgp2b2lkIGJ1aWxkU0EoKXsKICAgIHNhPXJhaz10bXA9dmVjdG9yPGludD4obisxKTsKCiAgICBmb3IoaW50IGk9MTtpPD1uO2krKykgc2FbaV09aSxyYWtbaV09c1tpXSx0bXBbaV09MDsKCiAgICBmb3IoZ2FwPTE7Z2FwPD1uICYmIChnYXA9PTEgfHwgcmFrW3NhW25dXTxuKTtnYXA8PD0xKQogICAgewogICAgICAgIHNvcnQoc2EuYmVnaW4oKSsxLHNhLmJlZ2luKCkrbisxLHN1ZmNtcCk7CgogICAgICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKSB0bXBbc2FbaV1dID0gdG1wW3NhW2ktMV1dICsgc3VmY21wKHNhW2ktMV0sc2FbaV0pOwogICAgICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKSByYWtbaV09dG1wW2ldOwogICAgfQoKfQoKdm9pZCBidWlsZExDUCgpewogICAgbGNwPXZlY3RvcjxpbnQ+KG4rMSk7CgogICAgZm9yKGludCBpPTEsaz0wO2k8PW47aSsrKQogICAgICAgIGlmKHJha1tpXT4xKQogICAgICAgIHsKICAgICAgICAgICAgZm9yKGludCBqPXNhW3Jha1tpXS0xXTtzW2kra109PXNbaitrXTspICsrazsKCiAgICAgICAgICAgIGxjcFtyYWtbaV1dPWs7CgogICAgICAgICAgICBrLT0oaz4wKTsKICAgICAgICB9Cn0KCmludCBtYWluKCkKewogICAgI2lmZGVmIGRtZGQKICAgIGZyZW9wZW4odGFnIi5pbnAiLCJyIixzdGRpbik7IGZyZW9wZW4odGFnIi5vdXQiLCJ3IixzdGRvdXQpOwogICAgI2VuZGlmIC8vIGRtZGQKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7Y2luLnRpZSgwKTtjb3V0LnRpZSgwKTsKCiAgICBjaW4+PnM7bj1zLnNpemUoKTtzPSIkIitzOwoKICAgIGJ1aWxkU0EoKTtidWlsZExDUCgpOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspIGNvdXQ8PHNhW2ldPDwiIDogIjw8bGNwW2ldPDwiXG4iOwogICAgcmV0dXJuIDA7Cn0K