#include <iostream>

#include <iomanip>

#include <vector>

#include <cmath>

#include <algorithm>

#include <climits>

#include <set>

#include <map>

#include <queue>

#include <deque>

#include <stack>

#include <string>

#include <list>

#include <ctime>

#include <complex>

#include <bitset>

#include <tuple>


#define IOS ios::sync_with_stdio(false);cin.tie(0)

#define all(x) x.begin(), x.end()

#define ff first

#define ss second

#define MOD 1000000007LL

#define rep(i,a,n) for (int i=a ; i<n ; i++)

#define per(i,a,n) for (int i=n-1 ; i>=a ; i--)

#define LLINF (llong)1e18+5

#define INF 1e9+5


using namespace std;

using llong = long long;

using VI = vector<int>;

using VLL = vector<long long>;

using PII = pair<int, int>;


string s1, s2;

vector<vector<int>> dp; // dp[i][j] = s1의 i번째 index, s2의 j번째 index로부터 만들 수 있는 longest


int dfs(int index1, int index2)

{

if (index1 == s1.length() || index2 == s2.length()) return 0;

if (dp[index1][index2] != -1) return dp[index1][index2];

if (s1[index1] == s2[index2]) return dp[index1][index2] = dfs(index1 + 1, index2 + 1) + 1;

else return dp[index1][index2] = max(dfs(index1 + 1, index2), dfs(index1, index2 + 1));

}


int main()

{

IOS;

cin >> s1 >> s2;

dp.resize(s1.length()+1);

rep(i, 0, s1.length()+1) dp[i].resize(s2.length()+1), fill(all(dp[i]), -1);

int ans = dfs(0, 0);

int startY = 0, startX = 0;

rep(i, 0, dp.size())

{

rep(j, 0, dp[i].size())

{

cout.width(3);

cout << dp[i][j] << " ";

}

cout << endl;

}

cout << ans << endl;

if(ans > 0)

while (1)

{

while (1)

if (dp[startY + 1][startX + 1] == ans)

{

startY++; startX++;

}

else break;

while (1)

if (dp[startY + 1][startX] == ans) startY++;

else break;

while (1)

if (dp[startY][startX + 1] == ans) startX++;

else break;

//cout << startY << " " << startX << endl;

cout << s1[startY];

ans--;

if (ans <= 0) break;

}


return 0;

}


니네도 종만북사라 dp실력 개늘었다