/*
https://atcoder.jp/contests/abc198/tasks/abc198_d
題意：
輸入三個字符串S1, S2, S3(每個字符串均由小寫字母組成)
每個字符串代表一個整數，其中每個字母代表一個0到9的數字。
兩個字母代表的數字相等當且僅當兩個字母相同。
找出一個可能的S1, S2, S3

思路：
因爲一位整數只有10個，且不同字母不能代表相同數字，
所以當字母種類大於10個的話判定不可。
否則，就DFS找答案。

P.S.:
1. 沒有注意到題中有說每個數字的開頭沒有多餘的0，這個沒有判斷，WA了幾次
*/



#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
using namespace std;

typedef long long int ll;

string s[3];
int alphabet[26];
vector<char> charset;
int charsize;
int used[10];           // used[0] 代表數字0已經被用了
map<char, int> mapping; // mapping['a'] 代表小寫字母a對應的數字

// 將一個字符串轉換到對應的整數
// 字母對應的數字需要參考 mapping 字典
ll convert(string n){
    ll res = 0;
    for(int i = 0; i < n.length(); i++){
        res = res*10 + mapping[n[i]];
    }
    return res;
}

// 判斷字符串的首位字母對應的數字是否爲0
int isZero(string n){
    return mapping[n[0]] == 0;
}

// ith 代表當前對 charset[ith] 字母進行枚舉
// return 1 代表找到，則層層退回 main 函數
// return 0 的話代表這個枚舉無法成立，不做特殊處理
int dfs(int ith){
    
    // 如果 ith 等於 charsize，就判斷當前等式是否成立
    if(ith == charsize){
        
        // 先判斷三個字符串的先頭是否爲0
        if( isZero(s[0]) || isZero(s[1]) || isZero(s[2]) ){
            return 0;
        }

        // 轉換三個字符串到整數，在判斷是否相等
        // 相等的話直接在此輸出，並 return 1
        ll n0 = convert(s[0]);
        ll n1 = convert(s[1]);
        ll n2 = convert(s[2]);
        if( n0+n1 == n2 ){
            cout << n0 << endl;
            cout << n1 << endl;
            cout << n2 << endl;
            return 1;
        }else{
            return 0;
        }
    }


    // 枚舉第 ith 個字母
    for(int n = 0; n <= 9; n++){
        if( used[n] == 0 ){
            used[n] = 1;    // 佔位
            mapping[ charset[ith] ] = n;  // 設置字母和數字的對應關系
            if( dfs(ith+1) == 1){
                // 向下DFS
                // 如果成立的話，直接返回
                // 並且 return 1 告訴上層調用也返回
                return 1;
            }
            used[n] = 0;    // 用完了，復原
        }
    }

    // 這一層遍歷結束，沒有找到
    return 0;
}

int main(){    
    
    // 讀取數據
    // 用 alphabet 數組記錄每個字母是否出現過
    // 如果之前沒出現過，就把這個字母加入到 charset 裏
    for(int i = 0; i < 3; i++){
        cin >> s[i];
        for(int j = 0; j < s[i].length(); j++){
            if(alphabet[s[i][j] - 'a'] == 0){
                alphabet[s[i][j] - 'a']++;
                charset.push_back(s[i][j]);
            }
        }
    }

    // 計算出現了的不同字母的個數
    charsize = charset.size();
    if(charsize > 10){
        printf("UNSOLVABLE\n");
        return 0;
    }


    // 若出現的字母個數小於等於10個，DFS找答案
    memset(used, 0, sizeof used);
    if( dfs(0) == 0 ){
        // 全部找不到
        printf("UNSOLVABLE\n");
    }

    return 0;
}
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <algorithm>
#include <cmath>
#include <climits>
#include <iomanip>
#include <queue>
#include <stack>
#include <ctype.h>

using namespace std;

typedef long long ll;

const int INF = (1<<30)-1;
const ll LINF = (1LL<<60)-1;

#define rep(i, n) for (int i = 0; i < n; i++)

template<class T> 
bool chmax(T &a, T b) {if (a < b) {a = b;return true;}else return false;}

template<class T> 
bool chmin(T &a, T b) {if (a > b) {a = b;return true;}else return false;}

//コーナーケースに気をつけろ！
int main() {
    vector<string> s(3);
    rep(i, 3)   cin >> s[i];
    vector<char> ch;
    set<char> st;
    rep(i, 3) {
        for (auto c: s[i])
            st.insert(c);
    }
    if (st.size() > 10) {
        cout << "UNSOLVABLE" << endl;
        return 0;
    }
    int j = 0;
    while (st.size() < 10) {
        st.insert('a'+j);
        j++;
    }
    for (auto c: st)
        ch.push_back(c);
    
    sort(ch.begin(), ch.end());

    do {
        vector<int> num(26);
        for (int i = 0; i < ch.size(); i++)
            num[ch[i]-'a'] = i;
        vector<ll> n(3, 0);
        bool flag = true;
        rep(i, 3) {
            rep(j, s[i].size()) {
                n[i] = n[i] * 10 + num[s[i][j]-'a'];
                if (j == 0 && num[s[i][j]-'a'] == 0)
                    flag = false;
            }
        }
        if (flag == false)
            continue;
        ll sum = n[0] + n[1];
        if (sum == n[2]) {
            rep(i, 3)
                cout << n[i] << endl;
            return 0;
        }
    } while (next_permutation(ch.begin(), ch.end()));

    cout << "UNSOLVABLE" << endl;
    return 0;
}

//小数点精度
//cout << fixed << std::setprecision(15) << y << endl;