#include <bits/stdc++.h>
using namespace std;

string A, B, C;
long long x, y, z;

int func(vector<int> &V)
{
    x = y = z = 0;
    
    for (int i=0; i<A.size(); i++)
    {
        int dig = V[ A[i] - 'a' ];
        
        if (i == 0 && dig == 0)
            return 0;
        
        x = x * 10 + dig;
    }
    
    for (int i=0; i<B.size(); i++)
    {
        int dig = V[ B[i] - 'a' ];
        
        if (i == 0 && dig == 0)
            return 0;
        
        y = y * 10 + dig;
    }
    
    for (int i=0; i<C.size(); i++)
    {
        int dig = V[ C[i] - 'a' ];
        
        if (i == 0 && dig == 0)
            return 0;
        
        z = z * 10 + dig;
    }
    
    return (x + y == z);
}

int solve(int mask, int maxx, vector<int> &V)
{
    if (V.size() == maxx)
        return func(V);
    
    for (int i=0; i<10; i++)
    {
        if (mask & (1 << i))
            continue;
        
        V.push_back(i);
        
        if (solve((mask | (1 << i)), maxx, V))
            return 1;
        
        V.pop_back();
    }
    
    return 0;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(NULL), cout.tie(NULL);
    
    cin >> A >> B >> C;
    
    map<char, char> S;
    
    for (auto a : A)
        S[a];
    for (auto b : B)
        S[b];
    for (auto c : C)
        S[c];
    
    if (S.size() > 10)
    {
        cout << "UNSOLVABLE\n";
        return 0;
    }
    
    char ptr = 'a';
    
    for (auto &it: S)
        it.second = ptr++;
    
    for (auto &a : A)
        a = S[a];
    for (auto &b : B)
        b = S[b];
    for (auto &c : C)
        c = S[c];
    
    vector<int> V;
    
    if (!solve(0, S.size(), V))
        cout << "UNSOLVABLE\n";
    else
        cout << x << "\n" << y << "\n" << z << "\n";
    
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s1[15],s2[15],s3[15];
int a[15],b[15],c[15];
int n,m,k;

char dig[45];
int len;

void Discretize() {
	for(int i=1;i<=n;i++) {
		dig[++len]=s1[i];
	}
	for(int i=1;i<=m;i++) {
		dig[++len]=s2[i];
	}
	for(int i=1;i<=k;i++) {
		dig[++len]=s3[i];
	}
	sort(dig+1,dig+len+1);
	len=unique(dig+1,dig+len+1)-dig-1;
	for(int i=1;i<=n;i++) {
		a[i]=(lower_bound(dig+1,dig+len+1,s1[i])-dig);
	}
	for(int i=1;i<=m;i++) {
		b[i]=(lower_bound(dig+1,dig+len+1,s2[i])-dig);
	}
	for(int i=1;i<=k;i++) {
		c[i]=(lower_bound(dig+1,dig+len+1,s3[i])-dig);
	}
}

int match[11];//What i in the strings correspond to

bool vis[11];

bool hasLead[11];

bool check() {
	ll x=0,y=0,z=0;
	for(int i=1;i<=n;i++) {
		x=x*10+match[a[i]];
	}
	for(int i=1;i<=m;i++) {
		y=y*10+match[b[i]];
	}
	for(int i=1;i<=k;i++) {
		z=z*10+match[c[i]];
	}
	if(x+y==z) {
		printf("%lld\n%lld\n%lld",x,y,z);
		return 1;
	}
	return 0;
}

bool dfs(int step) {
	if(step==len+1) {
		if(check()) {
			return 1;
		}
		return 0;
	}
	for(int i=(hasLead[step]?1:0);i<=9;i++) {
		if(!vis[i]) {
			vis[i]=1;
			match[step]=i;
			if(dfs(step+1)) {
				return 1;
			}
			vis[i]=0;
		}
	}
	return 0;
}

int main() {
	scanf("%s %s %s",s1+1,s2+1,s3+1);
	n=strlen(s1+1),m=strlen(s2+1),k=strlen(s3+1);
	Discretize();
	if(len>10) {
		printf("UNSOLVABLE");
		return 0;
	}
	hasLead[a[1]]=hasLead[b[1]]=hasLead[c[1]]=1;
	if(!dfs(1)) {
		printf("UNSOLVABLE");
	}
	return 0;
}