#include using namespace std; using ll = long long; #define FOR(i, a, b) for (int i = (a); i < int(b); ++i) #define RFOR(i, a, b) for (int i = (b)-1; i >= int(a); --i) #define rep(i, n) FOR(i, 0, n) #define rep1(i, n) FOR(i, 1, int(n) + 1) #define rrep(i, n) RFOR(i, 0, n) #define rrep1(i, n) RFOR(i, 1, int(n) + 1) #define all(c) begin(c), end(c) const int MOD = 1000000007; template void __dump__(std::ostream &os, const T &first) { os << first; } template void __dump__(std::ostream &os, const First &first, const Rest &... rest) { os << first << ", "; __dump__(os, rest...); } #define dump(...) \ do { \ std::ostringstream os; \ os << __LINE__ << ":\t" << #__VA_ARGS__ << " = "; \ __dump__(os, __VA_ARGS__); \ std::cerr << os.str() << std::endl; \ } while (0) int from_roman(const std::string &s) { static const std::map m = {{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}}; static const auto get = [&](char c) { assert(m.find(c) != m.end()); return m.find(c)->second; }; int n = 0; for (int i = 0; i < (int)s.size(); ++i) { if (i + 1 == (int)s.size() || get(s[i]) >= get(s[i + 1])) n += get(s[i]); else n -= get(s[i]); } return n; } std::string to_roman(int n) { static const std::map m = {{1, "I"}, {5, "V"}, {10, "X"}, {50, "L"}, {100, "C"}, {500, "D"}, {1000, "M"}}; static const auto get = [&](int c) { assert(m.find(c) != m.end()); return m.find(c)->second; }; std::string res; int p = 1; while (n) { int d = n % 10; int f = d % 5; std::string s = ""; if (f == 0) { } else if (f <= 3) { for (int i = 0; i < f; ++i) s += get(p); } else if (f == 4) { s += get(p); } if (f <= 3) { if (d >= 5) s = get(p * 5) + s; } else { if (d >= 5) s += get(p * 10); else s += get(p * 5); } res = s + res; p *= 10; n /= 10; } return res; } int main() { int n; while (cin >> n) { int sum = 0; rep(i, n) { string s; cin >> s; sum += from_roman(s); } cout << (sum >= 4000 ? "ERROR" : to_roman(sum).c_str()) << endl; } }