#include using namespace std; int dp[1201][1201][3]; int backtracking[1201][1201][3][3]; int main(void) { cin.tie(0); ios::sync_with_stdio(false); int n, m; string s, t; cin >> n >> m; cin >> s; cin >> t; for (int i = 0; i <= 1200; i++) { for (int j = 0; j <= 1200; j++) { for(int k=0;k<3;k++) { dp[i][j][k] = 1e9; } } } memset(backtracking,-1,sizeof(backtracking)); for(int i=1;i<=n;i++) { dp[i][0][2] = 9 + 2*(i-1); backtracking[i][0][2][0] = i-1; backtracking[i][0][2][1] = 0; backtracking[i][0][2][2] = 2; } for(int i=1;i<=m;i++) { dp[0][i][1] = 9 + 2*(i-1); backtracking[0][i][1][0] = 0; backtracking[0][i][1][1] = i-1; backtracking[0][i][1][2] = 1; } dp[0][0][0] = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { for(int k=0;k<3;k++) { if (s[i - 1] == t[j - 1]) { //dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]); if(dp[i][j][0] > dp[i-1][j-1][k]) { dp[i][j][0] = dp[i-1][j-1][k]; backtracking[i][j][0][0] = i-1; backtracking[i][j][0][1] = j-1; backtracking[i][j][0][2] = k; } if(k==1) { if(dp[i][j][1] > dp[i][j-1][k] + 2) { dp[i][j][1] = dp[i][j-1][k] + 2; backtracking[i][j][1][0] = i; backtracking[i][j][1][1] = j - 1; backtracking[i][j][1][2] = k; } } else { if(dp[i][j][1] > dp[i][j-1][k] + 9) { dp[i][j][1] = dp[i][j-1][k] + 9; backtracking[i][j][1][0] = i; backtracking[i][j][1][1] = j-1; backtracking[i][j][1][2] = k; } } if(k==2) { if(dp[i][j][2] > dp[i-1][j][k] + 2) { dp[i][j][2] = dp[i-1][j][k] + 2; backtracking[i][j][2][0] = i - 1; backtracking[i][j][2][1] = j; backtracking[i][j][2][2] = k; } } else { if(dp[i][j][2] > dp[i - 1][j][k] + 9) { dp[i][j][2] = dp[i - 1][j][k] + 9; backtracking[i][j][2][0] = i - 1; backtracking[i][j][2][1] = j; backtracking[i][j][2][2] = k; } } } else { /* dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1); dp[i][j] = min(dp[i][j], dp[i - 1][j] + 1); dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1); */ if(dp[i][j][0] > dp[i-1][j-1][k] + 5) { dp[i][j][0] = dp[i-1][j-1][k] + 5; backtracking[i][j][0][0] = i-1; backtracking[i][j][0][1] = j-1; backtracking[i][j][0][2] = k; } if(k==1) { if(dp[i][j][1] > dp[i][j-1][k] + 2) { dp[i][j][1] = dp[i][j-1][k] + 2; backtracking[i][j][1][0] = i; backtracking[i][j][1][1] = j - 1; backtracking[i][j][1][2] = k; } } else { if(dp[i][j][1] > dp[i][j-1][k] + 9) { dp[i][j][1] = dp[i][j-1][k] + 9; backtracking[i][j][1][0] = i; backtracking[i][j][1][1] = j-1; backtracking[i][j][1][2] = k; } } if(k==2) { if(dp[i][j][2] > dp[i-1][j][k] + 2) { dp[i][j][2] = dp[i-1][j][k] + 2; backtracking[i][j][2][0] = i - 1; backtracking[i][j][2][1] = j; backtracking[i][j][2][2] = k; } } else { if(dp[i][j][2] > dp[i - 1][j][k] + 9) { dp[i][j][2] = dp[i - 1][j][k] + 9; backtracking[i][j][2][0] = i - 1; backtracking[i][j][2][1] = j; backtracking[i][j][2][2] = k; } } } } } } int res = 1e9; string A,B; int idx = -1; int N = n; int M = m; for(int k=0;k<3;k++) { if(dp[n][m][k] < res) { res = dp[n][m][k]; idx = k; } } while(1) { if(N==0 && M==0) { break; } if(idx==0) { A = s[N-1] + A; B = t[M-1] + B; } else if(idx==1) { A = '-' + A; B = t[M-1] + B; } else { A = s[N-1] + A; B = '-' + B; } int nn = backtracking[N][M][idx][0]; int nm = backtracking[N][M][idx][1]; int nidx = backtracking[N][M][idx][2]; N = nn; M = nm; idx = nidx; } cout << res << '\n'; cout << A << '\n'; cout << B << '\n'; return 0; }