#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define ll long long int
#define MOD 1000000007
#define INF 100000000000000 //INF - 1e14
#define vi vector<ll>
#define pb push_back
#define mpl map<ll,ll>
#define ff first
#define ss second
#define pll pair<ll,ll>
#define vpll vector<pair<ll,ll> >
#define fer(i, a, n) for( ll i = a; i <= n; i++)
#define fdr(i, a, n) for( ll i = a; i >= n; i--)
#define invec(n,v) vi v(n); fer(i,0,n-1) cin >> v[i]
#define insvec(n,v) rin(n); vi v(n); fer(i,0,n-1) cin >> v[i]
#define MK2DV(v,row,col,val) vector<vector<ll> > v(row, vector<ll>(col,val))
#define matrix vector<vector<ll> >
#define printpartition cout << "-------------------------------------------------------------" << endl;
#define printmat(mat,row,col) cout << #mat << "::" << endl; fer(i,0,row-1)fer(j,0,col-1)cout << mat[i][j] << " \n"[j == col-1]; printpartition;
using namespace std;
using namespace __gnu_pbds;
#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update>
void __print(int x) {cout << x;}
void __print(long x) {cout << x;}
void __print(long long x) {cout << x;}
void __print(unsigned x) {cout << x;}
void __print(unsigned long x) {cout << x;}
void __print(unsigned long long x) {cout << x;}
void __print(float x) {cout << x;}
void __print(double x) {cout << x;}
void __print(long double x) {cout << x;}
void __print(char x) {cout << '\'' << x << '\'';}
void __print(const char *x) {cout << '\"' << x << '\"';}
void __print(const string &x) {cout << '\"' << x << '\"';}
void __print(bool x) {cout << (x ? "true" : "false");}
template<typename T, typename V>
void __print(const pair<T, V> &x) {cout << '{'; __print(x.first); cout << ','; __print(x.second); cout << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cout << '{'; for (auto &i : x) cout << (f++ ? "," : ""), __print(i); cout << "}";}
void _print() {cout << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cout << ", "; _print(v...);}
template <typename T> inline void inp(T &any) {cin >> any;} template <typename T, typename... U>inline void inp(T &a, U &...b) {cin >> a; inp(b...);}
#define rin(args...) ll args; inp(args);
#ifndef ONLINE_JUDGE
#define debug(x...) cout << "[" << #x << "] = ["; _print(x)
#define matdeb(mat,row,col) printmat(mat,row,col);
#else
#define debug(x...)
#define matdeb(mat,row,col)
#endif
ll fast_pow(ll base, ll exp, ll M = MOD) { base = base % M; ll result = 1; while (exp > 0) { if (exp % 2 == 1) result = (result * base) % M; base = (base * base) % M; exp = exp / 2; } return result; }
ll modInverse(ll A, ll M = MOD) { return fast_pow(A, M - 2, M); } // only when M is prime
string yes = "Yes", no = "No";


ll dp[3000][3000];
char ans[3000][3000];
pair<int, int> nxt[3000][3000];

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	string a, b;
	cin >> a >> b;
	ll na = a.size();
	ll nb = b.size();
	if (a[0] == b[0]) {
		dp[0][0] = 1;
		ans[0][0] = a[0];
	}
	else {
		dp[0][0] = 0;
		ans[0][0] = 0;
	}
	nxt[0][0] = { -1, -1};
	fer(j, 1, nb - 1) {
		if (a[0] == b[j]) {
			dp[0][j] = 1;
			ans[0][j] = a[0];
			nxt[0][j] = { -1, -1};
		}
		else {
			dp[0][j] = dp[0][j - 1];
			nxt[0][j] = {0, j - 1};
		}
	}
	fer(i, 1, na - 1) {
		if (a[i] == b[0]) {
			dp[i][0] = 1;
			ans[i][0] = b[0];
			nxt[i][0] = { -1, -1};
		}
		else {
			dp[i][0] = dp[i - 1][0];
			nxt[i][0] = { i - 1, 0};
		}
	}
	fer(i, 1, na - 1) {
		fer(j, 1, nb - 1) {
			if (a[i] == b[j]) {
				dp[i][j] = dp[i - 1][j - 1] + 1;
				ans[i][j] = a[i];
				nxt[i][j] = {i - 1, j - 1};
			}
			else {
				if (dp[i - 1][j] > dp[i][j - 1]) {
					nxt[i][j] = {i - 1, j};
				}
				else {
					nxt[i][j] = {i, j - 1};
				}
				dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
			}
		}
	}
	ll ii = na - 1, jj = nb - 1, ilast, jlast;
	string res = "";
	while (ii != -1) {
		if (ans[ii][jj]) {
			res += ans[ii][jj];
		}
		ilast = ii, jlast = jj;
		ii = nxt[ilast][jlast].first;
		jj = nxt[ilast][jlast].second;
	}
	reverse(res.begin(), res.end());
	cout << res;
	return 0;
}

Measured memory_bytes: 149632