#include
#include
#include
#include
using namespace std;
string a, b;
int dp[3005][3005];
pair backtrack[3005][3005];
char bukva[3005][3005];
int rek(int i, int j) {
if(i < 0 or j < 0) {
return 0;
}
if(dp[i][j] != -1) {
return dp[i][j];
}
int result = 0;
int r1 = -10, r2 = 0, r3 = 0;
if(a[i] == b[j]) {
r1 = rek(i - 1, j - 1) + 1;
}
r2 = rek(i - 1, j);
r3 = rek(i, j - 1);
result = max(r1, max(r2, r3));
if(r3 == result) {
backtrack[i][j] = make_pair(i, j - 1);
bukva[i][j] = '.';
}
else if(r2 == result) {
backtrack[i][j] = make_pair(i - 1, j);
bukva[i][j] = '.';
}
else {
backtrack[i][j] = make_pair(i - 1, j - 1);
bukva[i][j] = a[i];
}
dp[i][j] = result;
return result;
}
int main()
{
ios_base::sync_with_stdio(false);
cout.tie(0);
cin.tie(0);
cin >> a >> b;
for(int i = 0; i < a.size(); i++) {
for(int j = 0; j < b.size(); j++) {
dp[i][j] = -1;
}
}
if(rek((int) a.size() - 1, (int) b.size() - 1) == 0) {
cout << "" << endl;
return 0;
}
pair p = make_pair(a.size() - 1, b.size() - 1);
string s = "";
while(true) {
if(p.first >= 0 and p.second >= 0) {
s += bukva[p.first][p.second];
p = make_pair(backtrack[p.first][p.second].first, backtrack[p.first][p.second].second);
}
else {
break;
}
}
for(int i = (int) s.size() - 1; i >= 0; i--) {
if(s[i] != '.') {
cout << s[i];
}
}
return 0;
}