#include <iostream>
using namespace std;
int n, m;
char x[1005], y[1005];
int c[1005][1005], b[1005][1005];//c 最长公共子序列的长度 b 由那个值得到 1 前面+1 2 上面 3 左面
void LCSlength(){
for(int i = 0; i <= n; ++i)
c[n][0] = 0;
for(int j = 0; j <= m; ++j)
c[0][j] = 0;
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j){
if(x[i] == y[j]){
c[i][j] = c[i - 1][j - 1] + 1;
b[i][j] = 1;
}
else if(c[i - 1][j] > c[i][j - 1]){
c[i][j] = c[i - 1][j];
b[i][j] = 2;
}
else if(c[i][j - 1] > c[i - 1][j]){
c[i][j] = c[i][j - 1];
b[i][j] = 3;
}
}
}
}
void LCS(int i, int j){
if(i == 0 || j == 0){
return ;
}
else if(b[i][j] == 1){
LCS(i - 1, j - 1);
cout << x[i] << " ";
}
else if(b[i][j] == 2){
LCS(i - 1, j);
}
else if(b[i][j] == 3){
LCS(i, j - 1);
}
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; ++i){
cin >> x[i];
}
for(int i = 1; i <= m; ++i){
cin >> y[i];
}
LCSlength();
int tj, maxn = 0;
for(int i = 0; i <= m; ++i){
if(maxn < c[n][i]){
maxn = c[n][i] ;
tj = i;
}
}
cout << maxn << endl;
/* for(int i = 0; i <= n; ++i){
for(int j = 0; j <= m; ++j){
cout << c[i][j] << " ";
}
cout << endl;
}
cout << endl << endl;
for(int i = 0; i <= n; ++i){
for(int j = 0; j <= m; ++j){
cout << b[i][j] << " ";
}
cout << endl;
}*/
LCS(n, tj);
return 0;
}
/*
7 6
abcbdab
bdcaba
*/