#include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair #define vi vector #define ll long long #define SZ(x) ((int)(x.size())) #define IN(x,y) ((y).find((x)) != (y).end()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof (t.begin()) i = t.begin(); i != t.end(); i++) #define fi first #define se second int n,l1,l2,fnd,K,q1,q2; char c[100100]; char w1[111], w2[111], t[111]; string res; pair all1[100100], all2[100100]; void add(string x) { if(fnd == 0) { //printf("add %s\n", x.c_str()); res = x; fnd++; return; } int R = SZ(res); FOR(i,SZ(x)) if(res[i%R] != x[i]) { //printf("add+ %s\n", x.c_str()); fnd++; return; } if(SZ(x) % R != 0) { fnd++; return; } } void run(char *w, int l, pair *all, int &q, int k) { FOR(i,n-l+1) { bool ok = 1; FOR(j,k) t[j] = '#'; t[k] = 0; FOR(j,l) { int pos = (i+j) % k; char cur = 'A' + w[j] - c[i+j]; if(cur < 'A') cur += 26; if(t[pos] != '#' && t[pos] != cur) { ok = 0; break; } t[pos] = cur; } if(!ok) continue; //printf("all[%d] = %s\n", q, t); all[q++] = mp(t,i); } } int main () { while(1) { fnd = 0; q1=q2=0; scanf("%d", &K); if(!K) return 0; scanf("%s%s%s", w1, w2, c); for(n=0;c[n];n++) ; for(l1=0;w1[l1];l1++) ; for(l2=0;w2[l2];l2++) ; FORI(k,K) { run(w1, l1, all1, q1, k); run(w2, l2, all2, q2, k); sort(all1, all1+q1); sort(all2, all2+q2); for(int i = 0, j = 0; i < q1 && j < q2; ) { if(all1[i].fi == all2[j].fi) { //printf("all1 = (%s, %d); all2 = (%s, %d)\n", all1[i].fi.c_str(), all1[i].se, all2[j].fi.c_str(), all2[j].se); int i1 = i+1, j1 = j+1; while(i1 < q1 && all1[i1].fi == all1[i].fi) i1++; while(j1 < q2 && all2[j1].fi == all2[j].fi) j1++; //printf("i = %d, j = %d, i1 = %d, j1 = %d\n", i,j,i1,j1); if(all1[i].se + l1 <= all2[j1-1].se) add(all1[i].fi); else if(all1[i1-1].se >= all2[j].se + l2) add(all1[i].fi); i = i1; j = j1; } else if(all1[i].fi < all2[j].fi) i++; else j++; } if(fnd==2) break; } if(fnd == 2) printf("ambiguous\n"); else if(fnd == 0) printf("impossible\n"); else { FOR(i,n) { c[i] += res[i%res.size()] - 'A'; if(c[i] > 'Z') c[i] -= 26; } printf("%s\n", c); } } return 0; }