#include <bits/stdc++.h>
using namespace std;
#define _USE_MATH_DEFINES
#include <cmath>
 long long MOD=1000000007;
// vector<long long > t(4*100001);
long long binary_exp(long long a,long long b)
{
  long long ans=1;
  while(b>0)
  {
    if(b&1)
    {
      ans=(ans*a)%MOD;
    }
    a=(a*a)%MOD;
    b=b>>1;
  }
  return ans;
}
// long long gcd(long long a,long long b)
// {
//   if(b>a)
//   {
//     return gcd(b,a);
//   }
//   if(b==0)
//   {
//     return a;
//   }
//   else
//   {
//     return gcd(b,a%b);
//   }
// }
class comp{
public:
    bool operator()(pair<long long ,long long > a,pair<long long ,long long > b)
{
  if(a.first>b.first)
  {
    return false;
  }
  else if(a.first==b.first && a.second<b.second)
  {
    return false;
  }
  else
  {
    return true;
  }
 }
};
// void buildseg(long long  x,long long  l,long long  r,vector<long long > &a,long long  modi)
// {
//   if(l==r)
//   {
//     t[x]=a[l]%modi;
//   }
//   else
//   {
//     long long  mid=(l+r)/2;
//     buildseg(2*x+1,l,mid,a,modi);
//     buildseg(2*x+2,mid+1,r,a,modi);
//     t[x]=(t[2*x+1]+t[2*x+2])%modi;
//   }
// }
// long long  sum(long long  x,long long  l1,long long  r1,long long  l,long long  r,long long  modi)
// {
//   if(l>r)
//   {
//     return 0;
//   }
//   else if(l1==l && r1==r)
//   {
//     return t[x];
//   }
//   else
//   {
//     long long  mid=(l1+r1)/2;
//     return (sum(2*x+1,l1,mid,l,min(r,mid),modi)+sum(2*x+2,mid+1,r1,max(l,mid+1),r,modi))%modi;
//   }
// }
// void update(long long  x,long long  l,long long  r,long long  value,long long  pos,long long  modi)
// {
//   if(l==r)
//   {
//     t[x]=value%modi;
//   }
//   else
//   {
//     long long  mid=(l+r)/2;
//     if(mid>=pos)
//     {
//       update(2*x+1,l,mid,value,pos,modi);
//     }
//     else
//     {
//         update(2*x+2,mid+1,r,value,pos,modi);
//     }
//     t[x]=(t[2*x+1]+t[2*x+2])%modi;
//   }
// }
// void prdoubleseg(long long  n)
// {
//   for(long long  i=0;i<4*n;i++)
//   {
//     cout<<t[i]<<" ";
//   }
//   cout<<endl;
// }
// void dfs(double x,  vector<vector<double> > &adj,vector<set<double> > &v,double &count,vector<double> &vis)
// {
//   v[x].insert(count);
//   vis[x]=1;
//   for(auto i : adj[x])
//   {
//     if(vis[i]==0)
//     {
//       vis[i]=1;
//       dfs(i,adj,v,count,vis);
//     }
//   }
// }
void bfs(long long s,vector<vector<int> > adj,vector<int> &vis,vector<int> &pred)
  {
    queue<int> q;
    q.push(s);
    vis[s]=1;
    while(!q.empty())
    {
      long long j=q.front();
      q.pop();
    //  cout<<j<<" ";
      for(auto i:adj[j])
      {
        if(vis[i]==0)
        {
          q.push(i);
          pred[i]=j;
          vis[i]=1;
        }
      }
    }
  }
// long long  diff(long long  a ,long long  b,long long  c)
// {
//   long long  q=min(a,b);
//   q=min(q,c);
//   long long  w=max(a,b);
//   w=max(w,c);
//   return (w-q);
// }
  map<pair<int,int>,int> mp;
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long T;
  T=1;
  while(T--)
  {
    string s,t;
    cin>>s>>t;
    int n=s.size();
    int m=t.size();
    vector<vector<int> > dp(n+1,vector<int>(m+1,0));
    for(int i=1;i<=n;i++)
    {
      for(int j=1;j<=m;j++)
      {
        if(s[i-1]==t[j-1])
        {
          dp[i][j]=1+dp[i-1][j-1];
        }
        else
        {
          dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
        }
      }
    }
    string ans="";
    //cout<<s[n-1]<<endl;
    int i=n,j=m;
    while(i>=1 && j>=1)
    {
        if(s[i-1]==t[j-1])
        {
          ans+=s[i-1];
        //  cout<<s[i-1]<<endl;
          i--;
          j--;
        }
        else
        {
          if(dp[i-1][j]>dp[i][j-1])
          {
            i--;
          }
          else
          {
            j--;
          }
        }

    }
    reverse(ans.begin(),ans.end());
    cout<<ans<<endl;
  }
   return 0;
}


Measured memory_bytes: 35584