#pragma region templates
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using db = double;
using ld = long double;
template<typename T> using V = vector<T>;
template<typename T> using VV = vector<vector<T>>;
template<typename T> using PQ = priority_queue<T>;
#define fs first
#define sc second
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define eb emplace_back
#define lb(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define ub(c, x) distance((c).begin(), upper_bound(all(c), (x)))
#define all(v) (v).begin(),(v).end()
#define siz(v) (ll)(v).size()
#define rep(i,a,n) for(ll i=a;i<(ll)(n);++i)
#define repr(i,a,n) for(ll i=n-1;(ll)a<=i;--i)
#define ENDL '\n'
typedef pair<int,int> Pi;
typedef pair<ll,ll> PL;
constexpr ll mod = 1000000007; // 998244353;
constexpr ll INF = 1000000099;
constexpr ll LINF = (ll)(1e18 +99);
const ld PI = acos((ld)-1);
constexpr ll dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
template<typename T,typename U> inline bool chmin(T& t, const U& u){if(t>u){t=u;return 1;}return 0;}
template<typename T,typename U> inline bool chmax(T& t, const U& u){if(t<u){t=u;return 1;}return 0;}
template<typename T> inline T gcd(T a,T b){return b?gcd(b,a%b):a;}
inline void Yes() { cout << "Yes" << ENDL; }
inline void No() { cout << "No" << ENDL; }
inline void YES() { cout << "YES" << ENDL; }
inline void NO() { cout << "NO" << ENDL; }

template<typename T,typename Y> inline T mpow(T a, Y n) {
  T res = 1;
  for(;n;n>>=1) {
    if (n & 1) res = res * a;
    a = a * a;
  }
  return res;
}

template <typename T>
vector<T> finddivisor(T x) {  //整数xの約数(xを含む)
  vector<T> divisor;
  for(T i = 1; (i * i) <= x; i++) {
    if(x % i == 0) {
      divisor.push_back(i);
      if(i * i != x) { divisor.push_back(x / i);}
    }
  }
  sort(divisor.begin(), divisor.end());
  return divisor;
}

template <typename T> V<T> prefix_sum(const V<T>& v) {
  int n = v.size();
  V<T> ret(n + 1);
  rep(i, 0, n) ret[i + 1] = ret[i] + v[i];
  return ret;
}


template<typename T>
T rand(T l,T r){
  static random_device rd;
  static mt19937 g(rd());
  return uniform_int_distribution<T>(l,r)(g);
}

template<typename T>
istream& operator >> (istream& is, vector<T>& vec){
  for(auto&& x: vec) is >> x;
  return is;
}

template<typename T,typename Y>
ostream& operator<<(ostream& os,const pair<T,Y>& p){
  return os<<"{"<<p.fs<<","<<p.sc<<"}";
}

template<typename T> ostream& operator<<(ostream& os,const V<T>& v){
  os<<"{";
  for(auto e:v)os<<e<<",";
  return os<<"}";
}

template<typename ...Args>
void debug(Args&... args){
  for(auto const& x:{args...}){
    cerr<<x<<' ';
  }
  cerr<<ENDL;
}
#pragma endregion templates


signed main(){
  cin.tie(0);cerr.tie(0);ios::sync_with_stdio(false);
  cout<<fixed<<setprecision(20);
  V<string> s(3);cin>>s;
  V<char> cs(0);

  rep(i,0,3)for(auto&& c:s[i])cs.eb(c);

  sort(all(cs));
  cs.erase(unique(all(cs)),cs.end());



  
  ll bit=0,step=0;
  V<ll> v(3);
  unordered_map<char,int> ma;
  auto dfs=[&](auto self)->void{
    if(step==siz(cs)){
      v.assign(3,0);
      rep(i,0,3)rep(j,0,siz(s[i])){
        v[i]*=10;
        v[i]+=ma[s[i][j]];
        if(!j && ma[s[i][j]]==0)return;
      }

      if(v[0]+v[1]==v[2]){
        cout<<v[0]<<ENDL<<v[1]<<ENDL<<v[2]<<ENDL;
        exit(0);
      }
    }else{
      rep(i,0,10)if(!(bit & (1<<i))){
        bit|=(1<<i);
        ma[cs[step]]=i;
        step++;
        self(self);
        step--;
        bit^=(1<<i);
      }
    }
    return;
  };

  dfs(dfs);
  cout<<"UNSOLVABLE"<<ENDL;
}
//(・_・)(・_・)(・_・)(・_・)
//CHECK overflow,what to output?
//any other simpler approach?
#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define yes cout<<"YES\n";
#define no cout<<"NO\n";
#define f0(n) for(int i=0;i<n;i++)
#define f1(n) for(int i=1;i<=n;i++)
#define mii map<int,int>
#define mci map<char,int>
#define V vector<int>
#define vp vector<pair<int,int>>
#define pb push_back
#define pp pair<int,int>
#define ff first
#define ss second
#define S set<int>
#define show2(a, b) cout<<a<<' '<<b<<endl;
#define show3(a, b, c) cout<<a<<' '<<b<<' '<<c<<endl;
#define mod 1000000007
int f(string s){
	int n=0;
	for(int i=0;i<s.length();i++){
		n*=10;
		n+=(s[i]-'0');
	}
	return n;
}
int32_t main(){
    int t=1;
    //cin>>t;
	while(t--){
	string s1,s2,s3;
	cin>>s1>>s2>>s3;
	map<char,vector<pp>> m;
	f0(s1.length()) m[s1[i]].pb({1,i});
	f0(s2.length()) m[s2[i]].pb({2,i});
	f0(s3.length()) m[s3[i]].pb({3,i});
	vector<vector<pp>> a;
	for(auto i=m.begin();i!=m.end();i++) a.pb(i->ss);
	if(a.size()>10){
		cout<<"UNSOLVABLE\n";
		return 0;
	}
		V v={0,1,2,3,4,5,6,7,8,9};
			string t1=s1,t2=s2,t3=s3;
	do{
		for(int i=0;i<a.size();i++){
			for(int j=0;j<a[i].size();j++){
				if(a[i][j].ff==1) t1[a[i][j].ss]=v[i]+'0';
				if(a[i][j].ff==2) t2[a[i][j].ss]=v[i]+'0';
				if(a[i][j].ff==3) t3[a[i][j].ss]=v[i]+'0';
			}
		}
		if(t1[0]=='0'||t2[0]=='0'||t3[0]=='0') continue;
		int n1=f(t1),n2=f(t2),n3=f(t3);
		if(n1+n2==n3){
			cout<<n1<<endl;
			cout<<n2<<endl;
			cout<<n3<<endl;
			return 0;
		}
		
	}
	while(next_permutation(v.begin(),v.end()));
	cout<<"UNSOLVABLE\n";
	}
	
	return 0;
	}