#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define mod int(1e9)
#define flash                         \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL)
#define rep(i, a, b) for (ll i = a; i < b; i++)
#define repc(i, a, b, c) for (ll i = a; (c > 0 ? i < b : i > b) and c != 0; i += c)
#define mp make_pair
#define pb push_back
#define ff first
#define ss second
#define endl '\n'
#define all(name) (name.begin(), name.end())
#define fact(n) rep(i, 1, n + 1) ft.pb((ft[i - 1] * i) % mod);
#define mod_in(a) power(a, mod - 2)
#define ncr(n, r) ((ft[n] * mod_in((ft[r] * ft[(n) - (r)]) % mod)) % mod)
#define deb(x) cout << #x << " " << x << endl;
#define answ(x, y) cout << "Case #" << x << ": " << y << endl;
vector<bool> is_prime(1000, 1);
ll gcd(ll a, ll b)
{
    if (a == 0)
        return b;

    return gcd(b % a, a);
}
void sieve()
{
    is_prime[0] = is_prime[1] = 0;
    for (int i = 2; i * i <= 1000; i++)
        if (is_prime[i])
            repc(j, i * i, 1000, i) is_prime[j] = 0;
}
// pair<ll, ll> d[mod];
// ll h[mod];
// vector<ll> edge[mod];

// void dfs(ll u, ll pair = -1)
// {
//     for (auto i : edge[u])
//     {
//         if (i == pair)
//             continue;
//         h[i] = h[u] + 1;
//         dfs(i, u);
//         d[u].first += d[i].first + 1;
//     }
// }

bool cmp(pair<ll, ll> c, pair<ll, ll> b)
{
    return c.second - c.first > b.second - b.first;
}
// ll power(ll x, ll y)
// {
//     ll res = 1;
//     x %= mod;
//     while (y > 0)
//     {
//         if (y & 1)
//             res = (res * x) % mod;
//         y = y >> 1;
//         x = (x * x) % mod;
//     }
//     return res % mod;
// }


// void bfs(int st,vector<ll> d){
//     queue<int> q;
//     d[st]=0;
//     q.push(st);
//     while(!q.empty()){
//         int v=q.front();
//         q.pop();
//         for(auto it:edge[v]){
//             if(d[it]==mod){
//                 d[it]=d[v]+1;
//                 q.push(it);
//             }
//         }
//     }
// }
//using namespace std;
int main()
{
    long long int  i, j, k, o, n, m;
    string s,t;
    cin>>s>>t;
    if(s.length()>t.length()){
        string temp=s;
        s=t;
        t=temp;
    }
    pair<ll,pair<ll,ll>> dp[s.length()+1][t.length()+1];
    for(i=0;i<=t.length();i++){
        dp[0][i].first=0;
        dp[0][i].second=make_pair(0,i);
    }
    for(i=0;i<=s.length();i++){
        dp[i][0].first=0;
        dp[i][0].second=make_pair(i,0);
    }
    for(i=0;i<=s.length();i++){
        for(j=0;j<=t.length();j++){
            dp[i][j].first=0;
            dp[i][j].second=make_pair(i,j);
        }
    }
    for(i=1;i<=s.length();i++){
        for(j=1;j<=t.length();j++){
            if(s[i-1]==t[j-1]){
                dp[i][j].first=dp[i-1][j-1].first+1;
                dp[i][j].second={i-1,j-1};
                // if(dp[i-1][j].first==0){
                //     //dp[i][j]=s[i-1];
                //     dp[i][j].first=1;
                //     dp[i][j].second=make_pair(i,j);
                // }
                // else{
                //     //dp[i][j]=dp[i-1][j]+s[i-1];
                //     dp[i][j].first=dp[i-1][j].first+1;
                //     dp[i][j].second=make_pair(i-1,j);
                // }
            }
            else{
                if(dp[i-1][j].first>dp[i][j-1].first){
                    dp[i][j].first=dp[i-1][j].first;
                    dp[i][j].second=make_pair(i-1,j);
                }
                else{
                    dp[i][j].first=dp[i][j-1].first;
                    dp[i][j].second=make_pair(i,j-1);
                }
                // if(dp[i-1][j].length()==dp[i][j-1].length()){
                //     dp[i][j]=dp[i][j-1];
                // }
                // else if(dp[i-1][j].length()>dp[i][j-1].length()){
                //     dp[i][j]=dp[i-1][j];
                // }
                // else{
                //     dp[i][j]=dp[i][j-1];
                // }
            }
        }
    }
    //cout<<dp[s.length()][t.length()].first<<endl;
    ll x=s.length(),y=t.length();
    string ans="";
    ll tx=dp[x][y].second.first,ty=dp[x][y].second.second;
    while(true){
        //cout<<"x is "<<x<<" y is "<<y<<endl;
        //cout<<"tx is "<<tx<<" ty is "<<ty<<endl;
        if(dp[tx][ty].first!=dp[x][y].first){
            ans+=s[tx];
        }
        if(tx==x && ty==y){
            break;
        }
        //cout<<"ans is "<<ans<<endl;
        x=tx;
        y=ty;
        tx=dp[x][y].second.first;
        ty=dp[x][y].second.second;
    }
    //ans+=s[x-1];
    reverse(ans.begin(),ans.end());
    cout<<ans<<endl;
    //cout<<dp[s.length()][t.length()];
}

Measured memory_bytes: 211328