#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
typedef unsigned long long int ull;
#define MAX_SIZE 3003
#define gap ' '

char ara[MAX_SIZE], bra[MAX_SIZE];
lli dp[MAX_SIZE][MAX_SIZE];
lli n, m;

lli nextIndex[MAX_SIZE];

stack<lli> akash;

lli solve(int i, int j){
    if(i == n || j == m) return 0;
    if(dp[i][j] != -1) return dp[i][j];
    lli ans = 0;
    if(ara[i] == bra[j]){
        ans = 1 + solve(i+1, j+1);
    }
    else{
        lli ans1 = solve(i+1, j);
        lli ans2 = solve(i, j+1);
        ans = max(ans1, ans2);
    }
    return dp[i][j] = ans;
}

lli solveIter(){
    for(lli i=0; i<=n; i++) dp[i][m] = 0;
    for(lli i=0; i<=m; i++) dp[n][i] = 0;

    for(lli i = n-1; i>=0; i--){
        for(lli j = m-1; j>=0; j--){
            if(ara[i] == bra[j]){
                dp[i][j] = dp[i+1][j+1] + 1;
                akash.push(i);
            }else{
                dp[i][j] = max(dp[i+1][j], dp[i][j+1]);
            }
        }
    }

    return dp[0][0];
}

int main(){
    int T=1, cs=1;
    //scanf("%d", &T);
    while(T--){

        memset(dp, -1, sizeof(dp));
        scanf("%s", ara);
        scanf("%s", bra);
        n = strlen(ara);
        m = strlen(bra);
        lli startIndex = -1;
        lli ans = 0;
//        for(int i=0; i<n; i++){
//            lli tempAns = solve(i, 0);
//            if(tempAns>ans){
//                ans = tempAns;
//                startIndex = i;
//            }
//        }

        //cout<<solve(0, 0)<<endl;
        //cout<<ans<<endl;
        ans = solveIter();
        if(ans == 0){
            //cout<<"The answer is (an empty string).";
            return 0;
        }
        //cout<<ans<<endl;

//        cout<<"  \t";
//        for(lli i=0; i<m; i++)cout<<bra[i]<<'\t';
//        cout<<endl;
//        for(lli i=0; i<=n; i++){
//            cout<<ara[i]<<" :\t";
//            for(lli j=0; j<=m; j++){
//                cout<<dp[i][j]<<'\t';
//            }
//            cout<<endl;
//        }
//        char ansF[ans+2];
//        lli firstIndex = n-1;
//        while(!ara[firstIndex])firstIndex--;
//        int last = -1;
//        for(int i=firstIndex; i>=0; i--){
//            if(last == dp[i][0]) continue;
//            ansF[ans - (dp[i][0])] = ara[i];
//            last = dp[i][0];
//        }
//        ansF[ans] = '\0';
//        cout<<ansF<<endl;
        lli index = ans;
        for(lli i=0; i<=n; i++){
            int flag = 0;
            for(lli j=0; j<=m; j++){
                int ok1 = 0, ok2 = 0;
                while(dp[i][j] == ans){
                    i++;
                    ok1 = 1;
                }
                if(ok1) i--;
                while(dp[i][j] == ans){
                    ok2 = 1;
                    j++;
                }
                if(ok2) j--;
                ans--;
                cout<<ara[i];
//                cout<<i<<' '<<j<<": ";
//                cout<<ara[i]<<' '<<bra[j]<<" "<<ok1<<" "<<ok2<<endl;
                flag = 0;
                if(ans == 0){
                    flag = 1;
                    break;
                }
            }
            if(flag) break;
        }
    }

    return 0;
}

Measured memory_bytes: 144936