#include <stdio.h>#include <algorithm>#include <iostream>#include <queue>#include <set>#include <string.h>#include <map>#include <vector>#include <string>#include <math.h>using namespace std;const int MAXN = 100010;const int MOD = 1e9+7;int dp1[MAXN][2][2];int pre1[MAXN][2][2];int pre2[MAXN][2][2];void Add1(int &a,int b){if(a == 0)a = b;else if(a == 1){if(b == 1)a = 2;else if(b == 2)a = 2;}}char str1[MAXN],str2[MAXN];void Add2(int &a,int b){a += b;if(a >= MOD)a -= MOD;}int a[MAXN];int main(){while(scanf("%s%s",str1,str2) == 2){int n = strlen(str1);reverse(str1,str1+n);reverse(str2,str2+n);memset(dp1,0,sizeof(dp1));if(str2[0] == '0')dp1[0][0][0] = 1;else if(str2[0] == '1')dp1[0][1][1] = 1;else {dp1[0][0][0] = 1;dp1[0][1][1] = 1;}for(int i = 0;i < n-1;i++)for(int j = 0;j < 2;j++)for(int k = 0;k < 2;k++){if(dp1[i][j][k] == 0)continue;for(int nk = 0;nk < 2;nk++){if(str1[i] == '0' && nk != k)continue;if(str1[i] == '1' && nk == k)continue;if(str2[i+1] != '?'){if(j == 0 && nk != str2[i+1]-'0')continue;if(j == 1 && nk == str2[i+1]-'0')continue;}int nj = j|k|nk;Add1(dp1[i+1][nj][nk],dp1[i][j][k]);pre1[i+1][nj][nk] = j;pre2[i+1][nj][nk] = k;}}int ans1 = 0;int tj = -1;int tk = -1;for(int j = 0;j < 2;j++)for(int k = 0;k < 2;k++){if(str1[n-1] == '0' && k == 1)continue;if(str1[n-1] == '1' && k == 0)continue;if(dp1[n-1][j][k] == 0)continue;Add1(ans1,dp1[n-1][j][k]);if(dp1[n-1][j][k]){tj = j;tk = k;}}if(ans1 == 0){printf("IMPOSSIBLEn");continue;}if(ans1 == 1){printf("UNIQUEn");for(int i = n-1;i >= 0;i--){a[i] = tk;int nj = pre1[i][tj][tk];int nk = pre2[i][tj][tk];tj = nj;tk = nk;}for(int i = n-1;i >= 0;i--){if(i == n-1)printf("%d",a[i]);else printf("%d",a[i]^a[i+1]);}printf("n");int tmp1 = 0;while(tmp1 < n && a[tmp1] == 0 )tmp1++;for(int i = n-1;i >= 0;i--){if(i > tmp1)printf("%d",!a[i]);else printf("%d",a[i]);}printf("n");continue;}memset(dp1,0,sizeof(dp1));if(str2[0] == '0')dp1[0][0][0] = 1;else if(str2[0] == '1')dp1[0][1][1] = 1;else {dp1[0][0][0] = 1;dp1[0][1][1] = 1;}for(int i = 0;i < n-1;i++)for(int j = 0;j < 2;j++)for(int k = 0;k < 2;k++){if(dp1[i][j][k] == 0)continue;for(int nk = 0;nk < 2;nk++){if(str1[i] == '0' && nk != k)continue;if(str1[i] == '1' && nk == k)continue;if(str2[i+1] != '?'){if(j == 0 && nk != str2[i+1]-'0')continue;if(j == 1 && nk == str2[i+1]-'0')continue;}int nj = j|k|nk;Add2(dp1[i+1][nj][nk],dp1[i][j][k]);}}ans1 = 0;for(int j = 0;j < 2;j++)for(int k = 0;k < 2;k++){if(str1[n-1] == '0' && k == 1)continue;if(str1[n-1] == '1' && k == 0)continue;if(dp1[n-1][j][k] == 0)continue;Add2(ans1,dp1[n-1][j][k]);}printf("AMBIGUOUS %dn",ans1);}return 0;}


