#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#include <string>
#include <vector>
#include <sstream>
#include <utility>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MM=1000000007;
const int MN=100005;
char ss[2][MN];
LL sum[MN],s1[MN],len;
int lac,flag;

LL qmod(LL t){
    if (t==0) return 1;
    if (t==1) return 2;
    LL res=qmod(t>>1);
    res=(res*res)%MM;
    if (t&1) res=(res<<1)%MM;
    return res;
}

void writeans(){
    ss[0][lac+1]='1';
    ss[1][lac+1]='1';
    if (ss[0][lac]=='?' && ss[1][lac]=='?'){
        if (s1[lac]&1){ ss[0][lac]='1'; ss[1][lac]='0'; }
        else          { ss[0][lac]='0'; ss[1][lac]='1'; }
    }
    else
    if (ss[0][lac]=='?') ss[0][lac]=='0'+((ss[1][lac]-'0')^1);
    else
    if (ss[1][lac]=='?') ss[1][lac]=='0'+((ss[0][lac]-'0')^1);

    int st;
    if (ss[0][lac]=='0') st=0; else st=1;
    for (int i=0; i<len; i++)
        if (ss[0][i]=='?' && ss[1][i]=='?'){
            if (i>lac){ printf("0"); continue; }
            if ((s1[lac]%2)^st) printf("1"); else printf("0");
        }
        else if (ss[0][i]=='?') printf("%c",ss[1][i]);
        else printf("%c",ss[0][i]);
    puts("");
    for (int i=0; i<len; i++)
        if (ss[0][i]=='?' && ss[1][i]=='?'){
            if (i>lac){ printf("0"); continue; }
            if ((s1[lac]%2)^st) printf("1"); else printf("0");
        }
        else if (ss[1][i]=='?') printf("%c",ss[0][i]);
        else printf("%c",ss[1][i]);
    puts("");
}

LL calc(int k){
    LL tmp;
    if (ss[0][k]=='?' && ss[1][k]=='?') return qmod(sum[k]);
    if (ss[0][k]!='0' && ss[1][k]!='1')
        if (sum[k]>0) return qmod(sum[k]-1);
        else if (s1[k]&1) return 1;
    if (ss[0][k]!='1' && ss[1][k]!='0')
        if (sum[k]>0) return qmod(sum[k]-1);
        else if (!(s1[k]&1)) return 1;
    return 0;
}

LL gao1(int t){
    LL res=0;
    if (ss[0][t+1]=='0' || ss[1][t+1]=='0') return 0;
    for (int i=t+2; i<len; i++)
        if (ss[0][i]=='1' || ss[1][i]==1) return 0;
    res=(res+calc(t))%MM;
    if (res>0 && lac==-1) lac=t;
    if (res>1) flag=1;
    return res;
}

LL gao0(){
    int i,j;
    LL res=0;
    for (i=len; i>0; i--){
        if (ss[0][i]!='?' && ss[1][i]!='?' && ss[0][i]!=ss[1][i]) return res;
        if (ss[0][i]=='1' || ss[1][i]=='1'){
            res=(res+calc(i-1))%MM;
            if (res>0 && lac==-1) lac=i-1;
            if (res>1) flag=1;
            return res;
        }
        if (ss[0][i]=='?' && ss[1][i]=='?'){
            res=(res+calc(i-1))%MM;
            if (res>0 && lac==-1) lac=i-1;
            if (res>1) flag=1;
        }
    }
    return res;
}

int main(){
    //freopen("in","r",stdin);
    int T,cas=0;
    scanf("%d",&T);
    while (T--){
        scanf("%s%s",ss[0],ss[1]);
        int i,j,k=0;
        len=strlen(ss[0]);
        for (i=0; i<len; i++)
            if (ss[0][i]!='?' && ss[1][i]!='?' && ss[0][i]!=ss[1][i]){
                k++; j=i;
            }
        printf("Case #%d:\n",++cas);
        if (k>=2){ puts("Impossible"); continue; }

        sum[0]=0; s1[0]=0;
        for (i=1; i<=len; i++){
            sum[i]=sum[i-1]; s1[i]=s1[i-1];
            if (ss[0][i-1]=='?' && ss[1][i-1]=='?') sum[i]++;
            if (ss[0][i-1]=='1' || ss[1][i-1]=='1') s1[i]++;
        }
        ss[0][len]=ss[1][len]='?';

        lac=-1;
        flag=0;
        int res=0;
        if (k) res=int(gao1(j)%MM);
        else   res=int(gao0()%MM);

        if (lac==-1){ puts("Impossible"); continue; }
        if (flag){ printf("Ambiguous %d\n",res); continue; }
        writeans();
    }
    return 0;
}
