#include <iostream>
#include <string>
#include <vector>
#include <cassert>
using namespace std;

struct solver_t
{
	solver_t(string const& a, string const& b, string const& c)
		: lhs(a)
		, rhs(b)
		, res(c)
		, subst(128, -1)
		, used{}
	{
		cout << lhs << " + " << rhs << " == " << res << "\n";
	}
	
	string lhs;
	string rhs;
	string res;

	vector<int> subst;
	int used[10];
	
	int to_number(string& s)
	{
		int ret = 0;
		for (char c : s)
		{
			assert(subst[c] >= 0);
			ret = ret * 10 + subst[c];
		}
		return ret;
	}

	void check_and_print()
	{
		int left = to_number(lhs);
		int right = to_number(rhs);
		int result = to_number(res);
		
		if (left + right == result)
		{
			cout << left << " + " << right << " == " << result << "\n";
		}
	}

	void for_each_subst(string& s, int cr, int depth)
	{
		char c = s[s.size() - depth];
		for (int i = depth == s.size(); i < 10; ++i)
		{
			if (used[i]) { continue; }
			
			subst[c] = i;
			used[i] = true;
			
			solve(cr, depth);
			
			used[i] = false;
			subst[c] = -1;
		}
	}

	void solve(int cr = 0, int depth = 1)
	{
		if (depth > lhs.size() || depth > rhs.size() || depth > res.size())
		{
			check_and_print();
			return;
		}
		
		char c = res[res.size() - depth];
		if (subst[c] >= 0)
		{
			char a = lhs[lhs.size() - depth];
			if (subst[a] >= 0)
			{
				char b = rhs[lhs.size() - depth];
				if (subst[b] >= 0)
				{
					int sum = subst[a] + subst[b] + cr;
					if (sum % 10 != subst[c])	{ return; }
					solve(sum / 10, depth + 1);
				}
				else
				{
					for_each_subst(rhs, cr, depth);
				}
			}
			else
			{
				for_each_subst(lhs, cr, depth);
			}
		}
		else
		{
			for_each_subst(res, cr, depth);
		}
	}
};

int main() 
{
	solver_t("send", "more", "money")
		.solve();
}