#include <bits/stdc++.h>
using namespace std;
string A,B;
class type{
public:
int opt, pos;
char val;
type(){}
type(int OPT, int POS, char VAL) : opt(OPT), pos(POS), val(VAL){}
};
int N, M;
vector<vector<int>> arr;
stack<type> ans;
int f(int n, int m){
if(arr[n][m] != -1){
return arr[n][m];
}
if(!n && !m){
return 0;
}
if(!n){ // insert B[m] at n+1
// printf("%d %d: %d = %d\n", n,m, 1, f(n, m-1) + 1);
return arr[n][m] = f(n, m-1) + 1;
}
if(!m){ // delete A[n] at n
// printf("%d %d: %d = %d\n", n,m, 2, f(n-1, m) + 1);
return arr[n][m] = f(n-1, m) + 1;
}
int best = max(n, m);
int opt = -1;
int matchCost = f(n-1, m-1) + (A[n] == B[m] ? 0 : 1);
if(matchCost <= best){
best = matchCost;
opt = 0;
}
// printf("matchCost for %d %d is %d\n", n, m , matchCost);
int insertCost = f(n, m-1) + 1; // insert B[m] at n+1
if(insertCost <= best){
best = insertCost;
opt = 1;
}
// printf("insertCost for %d %d is %d\n", n,m,insertCost);
int delCost = f(n-1, m) + 1; // delete A[n] at n
if(delCost <= best){
best = delCost;
opt = 2;
}
// printf("delCost for %d %d is %d\n", n,m,delCost);
// printf("Best cost for %d %d is %d\n", n,m, best);
return arr[n][m] = best;
}
void traceBack(int n, int m){
// printf("Traceback %d %d\n",n,m);
if(!n && !m){
return;
}
if(!n){ // insert B[m] at n + 1
traceBack(n, m-1);
ans.push(type(1, n+1, B[m]));
return;
}
if(!m){ // delete A[n] at n
traceBack(n-1, m);
ans.push(type(2, n, A[n]));
return;
}
int best = max(n, m);
int opt = -1;
int matchCost = f(n-1, m-1) + (A[n] == B[m] ? 0 : 1);
if(matchCost <= best){
best = matchCost;
opt = 0;
}
int insertCost = f(n, m-1) + 1; // insert B[m] at n + 1
if(insertCost <= best){
best = insertCost;
opt = 1;
}
int delCost = f(n-1, m) + 1; // delete A[n] at n
if(delCost <= best){
best = delCost;
opt = 2;
}
// printf("Traceback %d %d: opt is %d\n",n,m,opt);
if(opt == 0){
traceBack(n-1, m-1);
if(A[n] == B[m]){
// no operation
} else {
// printf("Replace %c with %c at %d\n", A[n], B[m], n);
ans.push(type(opt, n, B[m]));
}
} else if (opt == 1){
traceBack(n, m-1);
// printf("Insert %c at %d\n", B[m], n+1);
ans.push(type(opt, n+1, B[m]));
} else if (opt == 2){
traceBack(n-1, m);
ans.push(type(opt, n, A[n]));
}
}
int main(){
string a, b;
//char buff[1000];
while(cin >> a){
/*a = b = "";
int index;
for(index = 0; buff[index]; index++){
if(buff[index] == ' '){
index++;
break;
}
a.push_back(buff[index]);
}*/
A = " ";
B = " ";
if(a == "#") return 0;
N = a.size();
A += a;
/*for(index; buff[index]; index++){
if(buff[index] == '\n'){
break;
}
b.push_back(buff[index]);
}*/
cin >> b;
M = b.size();
B += b;
arr.assign(N+1, vector<int>(M+1, -1));
f(N, M);
traceBack(N, M);
while(!ans.empty()){
type t = ans.top();
ans.pop();
if(t.opt == 0){
printf("C%c%02d", t.val, t.pos);
} else if (t.opt == 1){
printf("I%c%02d", t.val, t.pos);
} else if (t.opt == 2){
printf("Da%02d", t.pos);
}
}
printf("E\n");
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RyaW5nIEEsQjsKCmNsYXNzIHR5cGV7CnB1YmxpYzoKICAgIGludCBvcHQsIHBvczsKICAgIGNoYXIgdmFsOwogICAgdHlwZSgpe30KICAgIHR5cGUoaW50IE9QVCwgaW50IFBPUywgY2hhciBWQUwpIDogb3B0KE9QVCksIHBvcyhQT1MpLCB2YWwoVkFMKXt9Cn07CgppbnQgTiwgTTsKdmVjdG9yPHZlY3RvcjxpbnQ+PiBhcnI7CnN0YWNrPHR5cGU+IGFuczsKCmludCBmKGludCBuLCBpbnQgbSl7CiAgICBpZihhcnJbbl1bbV0gIT0gLTEpewogICAgICAgIHJldHVybiBhcnJbbl1bbV07CiAgICB9CgogICAgaWYoIW4gJiYgIW0pewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYoIW4peyAvLyBpbnNlcnQgQlttXSBhdCBuKzEKICAgICAgICAgICAvLyBwcmludGYoIiVkICVkOiAlZCA9ICVkXG4iLCBuLG0sIDEsIGYobiwgbS0xKSArIDEpOwogICAgICAgIHJldHVybiBhcnJbbl1bbV0gPSBmKG4sIG0tMSkgKyAxOwogICAgfQogICAgaWYoIW0peyAvLyBkZWxldGUgQVtuXSBhdCBuCiAgICAgIC8vICBwcmludGYoIiVkICVkOiAlZCA9ICVkXG4iLCBuLG0sIDIsIGYobi0xLCBtKSArIDEpOwogICAgICAgIHJldHVybiBhcnJbbl1bbV0gPSBmKG4tMSwgbSkgKyAxOwogICAgfQoKICAgIGludCBiZXN0ID0gbWF4KG4sIG0pOwogICAgaW50IG9wdCA9IC0xOwogICAgaW50IG1hdGNoQ29zdCA9IGYobi0xLCBtLTEpICsgKEFbbl0gPT0gQlttXSA/IDAgOiAxKTsKICAgIGlmKG1hdGNoQ29zdCA8PSBiZXN0KXsKICAgICAgICBiZXN0ID0gbWF0Y2hDb3N0OwogICAgICAgIG9wdCA9IDA7CiAgICB9CiAgIC8vIHByaW50ZigibWF0Y2hDb3N0IGZvciAlZCAlZCBpcyAlZFxuIiwgbiwgbSAsIG1hdGNoQ29zdCk7CiAgICBpbnQgaW5zZXJ0Q29zdCA9IGYobiwgbS0xKSArIDE7IC8vIGluc2VydCBCW21dIGF0IG4rMQogICAgaWYoaW5zZXJ0Q29zdCA8PSBiZXN0KXsKICAgICAgICBiZXN0ID0gaW5zZXJ0Q29zdDsKICAgICAgICBvcHQgPSAxOwogICAgfQogIC8vICBwcmludGYoImluc2VydENvc3QgZm9yICVkICVkIGlzICVkXG4iLCBuLG0saW5zZXJ0Q29zdCk7CiAgICBpbnQgZGVsQ29zdCA9IGYobi0xLCBtKSArIDE7IC8vIGRlbGV0ZSBBW25dIGF0IG4KICAgIGlmKGRlbENvc3QgPD0gYmVzdCl7CiAgICAgICAgYmVzdCA9IGRlbENvc3Q7CiAgICAgICAgb3B0ID0gMjsKICAgIH0KICAgLy8gcHJpbnRmKCJkZWxDb3N0IGZvciAlZCAlZCBpcyAlZFxuIiwgbixtLGRlbENvc3QpOwoKCiAgLy8gIHByaW50ZigiQmVzdCBjb3N0IGZvciAlZCAlZCBpcyAlZFxuIiwgbixtLCAgYmVzdCk7CiAgICByZXR1cm4gYXJyW25dW21dID0gYmVzdDsKfQoKdm9pZCB0cmFjZUJhY2soaW50IG4sIGludCBtKXsKICAgLy8gcHJpbnRmKCJUcmFjZWJhY2sgJWQgJWRcbiIsbixtKTsKICAgIGlmKCFuICYmICFtKXsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZighbil7IC8vIGluc2VydCBCW21dIGF0IG4gKyAxCiAgICAgICAgdHJhY2VCYWNrKG4sIG0tMSk7CiAgICAgICAgYW5zLnB1c2godHlwZSgxLCBuKzEsIEJbbV0pKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZighbSl7IC8vIGRlbGV0ZSBBW25dIGF0IG4KICAgICAgICB0cmFjZUJhY2sobi0xLCBtKTsKICAgICAgICBhbnMucHVzaCh0eXBlKDIsIG4sIEFbbl0pKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaW50IGJlc3QgPSBtYXgobiwgbSk7CiAgICBpbnQgb3B0ID0gLTE7CgoKCgogICAgaW50IG1hdGNoQ29zdCA9IGYobi0xLCBtLTEpICsgKEFbbl0gPT0gQlttXSA/IDAgOiAxKTsKICAgIGlmKG1hdGNoQ29zdCA8PSBiZXN0KXsKICAgICAgICBiZXN0ID0gbWF0Y2hDb3N0OwogICAgICAgIG9wdCA9IDA7CiAgICB9CgogICAgaW50IGluc2VydENvc3QgPSBmKG4sIG0tMSkgKyAxOyAvLyBpbnNlcnQgQlttXSBhdCBuICsgMQogICAgaWYoaW5zZXJ0Q29zdCA8PSBiZXN0KXsKICAgICAgICBiZXN0ID0gaW5zZXJ0Q29zdDsKICAgICAgICBvcHQgPSAxOwogICAgfQoKICAgIGludCBkZWxDb3N0ID0gZihuLTEsIG0pICsgMTsgLy8gZGVsZXRlIEFbbl0gYXQgbgogICAgaWYoZGVsQ29zdCA8PSBiZXN0KXsKICAgICAgICBiZXN0ID0gZGVsQ29zdDsKICAgICAgICBvcHQgPSAyOwogICAgfQoKCgogICAvLyBwcmludGYoIlRyYWNlYmFjayAlZCAlZDogb3B0IGlzICVkXG4iLG4sbSxvcHQpOwoKICAgIGlmKG9wdCA9PSAwKXsKICAgICAgICB0cmFjZUJhY2sobi0xLCBtLTEpOwogICAgICAgIGlmKEFbbl0gPT0gQlttXSl7CiAgICAgICAgICAgIC8vIG5vIG9wZXJhdGlvbgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyAgcHJpbnRmKCJSZXBsYWNlICVjIHdpdGggJWMgYXQgJWRcbiIsIEFbbl0sIEJbbV0sIG4pOwogICAgICAgICAgICBhbnMucHVzaCh0eXBlKG9wdCwgbiwgQlttXSkpOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAob3B0ID09IDEpewogICAgICAgIHRyYWNlQmFjayhuLCBtLTEpOwogICAgICAvLyAgcHJpbnRmKCJJbnNlcnQgJWMgYXQgJWRcbiIsIEJbbV0sIG4rMSk7CiAgICAgICAgYW5zLnB1c2godHlwZShvcHQsIG4rMSwgQlttXSkpOwogICAgfSBlbHNlIGlmIChvcHQgPT0gMil7CiAgICAgICAgdHJhY2VCYWNrKG4tMSwgbSk7CiAgICAgICAgYW5zLnB1c2godHlwZShvcHQsIG4sIEFbbl0pKTsKICAgIH0KCn0KCmludCBtYWluKCl7CiAgICBzdHJpbmcgYSwgYjsKICAgIC8vY2hhciBidWZmWzEwMDBdOwogICAgd2hpbGUoY2luID4+IGEpewoKICAgICAgICAvKmEgPSBiID0gIiI7CiAgICAgICAgaW50IGluZGV4OwogICAgICAgIGZvcihpbmRleCA9IDA7IGJ1ZmZbaW5kZXhdOyBpbmRleCsrKXsKICAgICAgICAgICAgaWYoYnVmZltpbmRleF0gPT0gJyAnKXsKICAgICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBhLnB1c2hfYmFjayhidWZmW2luZGV4XSk7CiAgICAgICAgfSovCgoKICAgICAgICBBID0gIiAiOwogICAgICAgIEIgPSAiICI7CiAgICAgICAgaWYoYSA9PSAiIyIpIHJldHVybiAwOwogICAgICAgIE4gPSBhLnNpemUoKTsKICAgICAgICBBICs9IGE7CgogICAgICAgIC8qZm9yKGluZGV4OyBidWZmW2luZGV4XTsgaW5kZXgrKyl7CiAgICAgICAgICAgIGlmKGJ1ZmZbaW5kZXhdID09ICdcbicpewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYi5wdXNoX2JhY2soYnVmZltpbmRleF0pOwogICAgICAgIH0qLwogICAgICAgIGNpbiA+PiBiOwoKCiAgICAgICAgTSA9IGIuc2l6ZSgpOwogICAgICAgIEIgKz0gYjsKICAgICAgICBhcnIuYXNzaWduKE4rMSwgdmVjdG9yPGludD4oTSsxLCAtMSkpOwogICAgICAgIGYoTiwgTSk7CiAgICAgICAgdHJhY2VCYWNrKE4sIE0pOwogICAgICAgIHdoaWxlKCFhbnMuZW1wdHkoKSl7CiAgICAgICAgICAgIHR5cGUgdCA9IGFucy50b3AoKTsKICAgICAgICAgICAgYW5zLnBvcCgpOwogICAgICAgICAgICBpZih0Lm9wdCA9PSAwKXsKICAgICAgICAgICAgICAgIHByaW50ZigiQyVjJTAyZCIsIHQudmFsLCB0LnBvcyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodC5vcHQgPT0gMSl7CiAgICAgICAgICAgICAgICBwcmludGYoIkklYyUwMmQiLCB0LnZhbCwgdC5wb3MpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHQub3B0ID09IDIpewogICAgICAgICAgICAgICAgcHJpbnRmKCJEYSUwMmQiLCB0LnBvcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJFXG4iKTsKICAgIH0KCgogICAgcmV0dXJuIDA7Cn0K