#include <cstdio>
#include <iostream>
#include <cstring>
#include <ctime>
using namespace std;
const int maxn = 201000;
char st[maxn];
int len, i, top, dws[maxn], ans;
struct node { node *ch[26], *f; int l, nl, ml;} a[maxn * 2], *head, *last, *b[maxn * 2];
void add(int x)
{
node *p = &a[++top], *mid = last;
last = p;
p->l = p->nl = mid->l + 1;
for (; mid && !mid->ch[x]; mid = mid->f) mid->ch[x] = p;
if (!mid) p->f = head; else
if (mid->l + 1 == mid->ch[x]->l) p->f = mid->ch[x]; else
{
node *q = mid->ch[x], *r = &a[++top];
*r = *q, r->l = r->nl = mid->l + 1;
q->f = p->f = r;
for (; mid && mid->ch[x] == q; mid = mid->f) mid->ch[x] = r;
}
}
int main()
{
freopen("LCSII.in", "r", stdin);
freopen("LCSII.out", "w", stdout);
scanf("%s\n", st);
len = strlen(st);
head = last = &a[0];
for (i = 0; i < len; ++i) add(st[i] - 'a');
for (i = 0; i <= top; ++i)
dws[a[i].l]++;
for (i = 1; i <= len; ++i) dws[i] += dws[i - 1];
for (i = 0; i <= top; ++i) b[--dws[a[i].l]] = &a[i];
for (; ~scanf("%s\n", st); )
{
len = strlen(st);
int mid = 0, y; last = head;
for (i = 0; i < len; ++i)
if (last->ch[y = st[i] - 'a'])
{
mid++, last = last->ch[y];
if (mid > last->ml) last->ml = mid;
} else
{
for (; last && !last->ch[y]; last = last->f);
if (!last) mid = 0, last =head; else
{
mid = last->l + 1, last = last->ch[y];
if (mid > last->ml) last->ml = mid;
}
}
for (i = top; i > 0; --i)
{
if (b[i]->ml < b[i]->nl) b[i]->nl = b[i]->ml;
if (b[i]->f->ml < b[i]->ml) b[i]->f->ml = b[i]->ml;
b[i]->ml = 0;
}
}
for (i = 0, ans = 0; i <= top; ++i)
if (a[i].nl > ans) ans = a[i].nl;
printf("%d\n", ans);
return 0;
}