#include <iostream>
#include<vector>
using namespace std;
//动态规划,dp[i][j]代表以s[i-1]和t[j-1]结尾的最长公共子串
//状态转移:如果s[i-1]==t[j-1],则dp[i][j]=dp[i-1][j-1]+1;如果不相等则dp[i][j]=0;
//边界条件:dp[0][j]=0;dp[i][0]=0;
int main() {
    string s,t;
    cin>>s>>t;
    int m=s.size();
    int n=t.size();
    int maxlen=0;//记录最长的公共子串长度
    int pos=300;//记录了最长子串的结尾位置
    vector<vector<int>>dp(m+1,vector<int>(n+1,0));
    for(int i=1; i<=m; i++)
    {
        for(int j=1; j<=n; j++)
        {
            if(s[i-1]==t[j-1])
            {
                dp[i][j]=dp[i-1][j-1]+1;
                if(maxlen<=dp[i][j])
                {
                    int tmp= m>=n? j-1 : i-1 ;//记录最长公共子串结尾在较短串中的位置
                    if(maxlen<dp[i][j] || tmp<pos)//两种情况需要更新结尾位置
                        pos=tmp;
                    maxlen=dp[i][j];//更新最大值
                }
            }
            else
                dp[i][j]=0;
        }
    }
    //输出最长公共子串
    if(m>=n)   
    {
        for(int i=pos-maxlen+1; i<=pos; i++)   
            cout<<t[i];
    }
    else
    {
        for(int i=pos-maxlen+1; i<=pos; i++)   
            cout<<s[i];
    }
    return 0;
}
// 64 位输出请用 printf("%lld")