/*
//ABDCDCBABC CBABCDCDBA 7
最长相同子序列(不需要连续)
采用动态规划DP 二维表 输出最后一个位置就可
*/
#include <iostream>
#include <string>
using namespace std;
int n, m;
string a, b;
int main() {
cin >> a >> b;
n = a.size();
m = b.size();
int f[n+1][m+1];
for(int i=0; i<=m; i++){
f[0][i] = 0;
}
for(int i=0; i<=n; i++){
f[i][0] = 0;
}
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(a[i-1] == b[j-1]) f[i][j] = f[i-1][j-1] + 1;
else f[i][j] = max(f[i-1][j], f[i][j-1]);
cout << f[n][m] << endl;
for(int i=0; i<=n; i++)
for(int j=0; j<=m; j++){
cout<<f[i][j];
if(j%m==0&&j!=0)cout<<endl;
}
return 0;
}