#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;
}