//#include<stdio.h>
//
//int memo[51][51][51] = {0};
//
//int w(int a, int b, int c);
//
//int main() {
// int a,b,c, temp;
//
// scanf("%d %d %d", &a, &b, &c);
//
// while (a!=-1 || b!=-1 || c!=-1) {
//
// temp = w(a,b,c);
// printf("w(%d, %d, %d) = %d\n", a,b,c,temp);
// scanf("%d %d %d", &a, &b, &c);
// }
//
// return 0;
//
//}
//
//
//
//int w(int a, int b, int c) {
// int v, d,e,f,g;
// // int res;
//
// if (a<=0 || b<=0 || c<=0) {
// return 1;
// }
//
//
//
// if (memo[a][b][c]!=0) {
// //printf("v:%d abc: %d %d %d\n",v,a,b,c);
// return memo[a][b][c];
// }
//
// else if (a>20 || b>20 || c>20) {
//
// memo[a][b][c] = w(20,20,20);
//
// return memo[a][b][c];
// }
//
// else if (a<b && b<c) {
//
//
// memo[a][b][c-1] = w(a,b,c-1);
// memo[a][b-1][c-1] = w(a,b-1,c-1);
// memo[a][b-1][c] = w(a,b-1,c);
//
// memo[a][b][c] = memo[a][b][c-1] + memo[a][b-1][c-1] - memo[a][b-1][c];
// return memo[a][b][c];
//
// }
//
// else {
// memo[a-1][b][c] = w(a-1, b, c);
// memo[a-1][b-1][c] = w(a-1, b-1, c);
// memo[a-1][b][c-1] = w(a-1, b, c-1);
// memo[a-1][b-1][c-1] = w(a-1, b-1, c-1);
// // printf("m: %d\n", memo[d] + memo[e] + memo[f] + memo[g]);
// memo[a][b][c] = memo[a-1][b][c] + memo[a-1][b-1][c] + memo[a-1][b][c-1] - memo[a-1][b-1][c-1];
// return memo[a][b][c];
//
// }
//}
//
#include<stdio.h>
#include<string.h>
int max(int a, int b);
int main() {
int dp[101][101] = {{0}};
int maxI, maxJ,i , j, lcsLen, lcsIdx=0;
char strA[1001] = {0}, strB[1001] = {0}, lcs[1000]={0};
scanf("%s", strA);
getchar();
scanf("%s", strB);
maxI = strlen(strA);
maxJ = strlen(strB);
// printf("%s", strA);
// printf("%c \n", strA[1]);
for (i=0; i<=maxI; i++) {
for (j=0; j<=maxJ; j++) {
if (strA[j]==strB[i]) {
// printf("working %d %d \n", i,j);
dp[i+1][j+1] = dp[i][j]+1;
}
else {
dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]);
}
}
}
lcsLen = dp[maxI][maxJ];
if (lcsLen!=0) {
for (i=1; i<=maxJ; i++) {
for (j=1; j<=maxI; j++) {
if (dp[j][i]==lcsIdx+1) {
lcs[lcsIdx] = strA[i-1];
lcsIdx++;
}
}
}
printf("%d\n",lcsLen);
printf("%s", lcs);
}
else {
printf("%d",lcsLen);
}
// for (i=0; i<=maxI; i++) {
// for (j=0; j<=maxJ; j++) {
// printf("%d ", dp[i][j]);
// }
// printf("\n");
// }
return 0;
}
int max(int a, int b) {
if (a>b) {
return a;
}
else {
return b;
}
}



