#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<vector>
#define ll long long
using namespace std;
const int MAXN=2e5+10;
int read()
{
int kkk=0,x=1;
char c=getchar();
while((c<'0' || c>'9') && c!='-') c=getchar();
if(c=='-') c=getchar(),x=-1;
while(c>='0' && c<='9') kkk=kkk*10+(c-'0'),c=getchar();
return kkk*x;
}
int cnt=1,last=1,n,ans[MAXN*2],ANS,maxn[MAXN*2];
struct SAM
{
int len,ch[26],fa;
}sam[MAXN*2];
void sam_in(int c)
{
int p=last,np=last=++cnt;
sam[np].len=sam[p].len+1;
while(p && !sam[p].ch[c])
{
sam[p].ch[c]=np;
p=sam[p].fa;
}
if(!p) sam[np].fa=1;
else
{
int q=sam[p].ch[c];
if(sam[q].len==sam[p].len+1) sam[np].fa=q;
else
{
int nq=++cnt;
sam[nq]=sam[q];
sam[nq].len=sam[p].len+1;
sam[np].fa=sam[q].fa=nq;
while(p && sam[p].ch[c]==q)
{
sam[p].ch[c]=nq;
p=sam[p].fa;
}
}
}
}
struct node
{
int head[MAXN*2],tot;
int to[MAXN*2],nextn[MAXN*2];
void ADD(int u,int v)
{
to[++tot]=v,nextn[tot]=head[u];
head[u]=tot;
}
}Ed;
void Pick(int u)
{
for(int i=Ed.head[u];i!=0;i=Ed.nextn[i])
{
int v=Ed.to[i];
Pick(v);
maxn[u]=max(maxn[u],min(sam[u].len,maxn[v]));
}
ans[u]=min(ans[u],maxn[u]);
}
//char s[15][MAXN];
char s[MAXN];
int main()
{
//while(~scanf("%s",s[++n])) ;
scanf("%s",s);
//int Len=strlen(s[1]);
int Len=strlen(s);
//for(int i=0;i<Len;++i) sam_in(s[1][i]-'a');
for(int i=0;i<Len;++i) sam_in(s[i]-'a');
for(int i=2;i<=cnt;++i) Ed.ADD(sam[i].fa,i);
for(int i=1;i<=cnt;++i) ans[i]=sam[i].len;
while(~scanf("%s",s))
//for(int p=2;p<=n;++p)
{
memset(maxn,0,sizeof(maxn));
//Len=strlen(s[p]);
Len=strlen(s);
for(int i=0,len=0,x=1;i<Len;++i)
{
//int c=s[p][i]-'a';
int c=s[i]-'a';
while(x!=1 && !sam[x].ch[c]) {x=sam[x].fa;len=sam[x].len;}
if(sam[x].ch[c]) x=sam[x].ch[c],++len;
maxn[x]=max(maxn[x],len);
}
Pick(1);
}
for(int i=1;i<=cnt;++i) ANS=max(ANS,ans[i]);
printf("%d\n",ANS);
return 0;
}
//ore no turn,draw!