#include #include int num[3],tot,n,f; char s[3][100],ans[3][100]; int check() { char str[100]; int a=0,b=0,c; for(int i=0;i=0;i--) { str[i]='0'+c%10; c/=10; } if(c>0||str[0]=='0') return 0; for(int i=0;i=num[a]) { b=0; a++; } if(a==2) { if(check()) tot++; return; } if(s[a][b]!='*') dfs(a,b+1); else { for(int i=0;i<10;i++) { if(b==0&&i==0) continue; s[a][b]='0'+i; dfs(a,b+1); if(tot>1) { s[a][b]='*'; return; } } s[a][b]='*'; } } void search(int a,int b,int c) { if(b>=num[a]) { b=0; a++; } if(c==n) { tot=0; dfs(0,0); if(tot==1) { f=1; for(int i=0;i<3;i++) strcpy(ans[i],s[i]); } return; } if(a>=3) return; char ch=s[a][b],tc; for(int i=0;i<=10;i++) { if(i==1&&b==0) continue; if(!i) tc='*'; else tc='0'+i-1; if(tc==s[a][b]) search(a,b+1,c); else { s[a][b]=tc; search(a,b+1,c+1); } if(f) { s[a][b]=ch; return; } s[a][b]=ch; } } void work() { int m=0; for(int i=0;i<3;i++) m+=num[i]; for(n=1;n<=m;n++) { f=0;; search(0,0,0); if(f) return; } } int main() { int cas=1; memset(s,0,sizeof(s)); while(scanf("%s",s[0])&&s[0][0]!='0') { scanf("%s%s",s[1],s[2]); for(int i=0;i<3;i++) num[i]=strlen(s[i]); tot=0; dfs(0,0); printf("Case %d: ",cas++); if(tot==1) printf("%s %s %s\n",s[0],s[1],s[2]); else { work(); printf("%s %s %s\n",ans[0],ans[1],ans[2]); } memset(s,0,sizeof(s)); } return 0; }