#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
using namespace std;

using ll = long long;
using ull = unsigned long long;
using ld = long double;

#define forn(i, a, n) for (int i = (int)(a); i < (int)(n); ++i)
#define ford(i, a, n) for (int i = (int)(n - 1); i >= (int)(a); --i)
#define fore(i, a, n) for (int i = (int)(a); i <= (int)(n); ++i)
#define all(a) (a).begin(), (a).end()
#define fs first
#define sn second
#define trace(a)\
    for (auto i : a) cerr << i << ' ';\
    cerr << '\n'
#define eb emplace_back

#ifndef M_PI
const ld M_PI = acos(-1.0);
#endif

template<typename T>
inline void setmax(T& a, T b) {
    if (a < b) a = b;
}

template<typename T>
inline void setmin(T& a, T b) {
    if (a > b) a = b;
}

const ld eps = 1e-9;
const int INF = 2000000000;
const ll LINF = 1ll * INF * INF;
const ll MOD = 1000000007;
string min_cyclic_shift (string s) {
    s += s;
    int n = (int) s.length();
    int i=0, ans=0;
    while (i < n/2) {
        ans = i;
        int j=i+1, k=i;
        while (j < n && s[k] <= s[j]) {
            if (s[k] < s[j])
                k = i;
            else
                ++k;
            ++j;
        }
        while (i <= k)  i += j - k;
    }
    return s.substr (ans, n/2);
}

vector<string> gen(int x, int y, int z) {
    if (x == 0 && y == 0 && z == 0) {
        return {""};
    }
    vector<string> ans;
    if (x) for (string s : gen(x - 1, y, z))
        ans.eb(s + "a");
    if (y) for (string s : gen(x, y - 1, z))
        ans.eb(s + "b");
    if (z) for (string s : gen(x, y, z - 1))
        ans.eb(s + "c");
    return ans;
}

string brute(int x, int y, int z) {
    vector<string> ss = gen(x, y, z);
    string ans = min_cyclic_shift(ss[0]);
    for (string s : ss)
        setmax(ans, min_cyclic_shift(s));
    return ans;
}

const int N = 52;
//string glob[N][N][N];

string solve(int x, int y, int z) {
    if (x + y + z <= 4) return brute(x, y, z);
    //cerr << "SOLVE: " << x << ' ' << y << ' ' << z << '\n';
    //if (!glob[x][y][z].empty()) return glob[x][y][z];
    if (y == 0 && z == 0) {
        string ans;
        forn(i, 0, x) ans += "a";
        return ans;
        //forn(i, 0, x) glob[x][y][z] += "a";
        //return glob[x][y][z];
    }
    if (x == 0) {
        string s = solve(y, z, 0);
        for (char& c : s) ++c;
        //glob[x][y][z] = s;
        return s;
    }
    if (y == 0) {
        string s = solve(x, z, 0);
        for (char& c : s) if (c == 'b') c = 'c';
        //glob[x][y][z] = s;
        return s;
    }
    vector<string> lets(3);
    lets[0] = "a";
    while (z >= x) {
        lets[0] += "c";
        z -= x;
    }
    string ans, s;
    if (z + y >= x) {
        lets[1] = lets[0];
        lets[0] += "b";
        lets[1] += "c";
        lets[2] = "b";
        x -= z;
        y -= x;
        s = solve(x, z, y);
    } else {
        lets[1] = lets[0];
        lets[2] = lets[0];
        lets[1] += "b";
        lets[2] += "c";
        s = solve(x - y - z, y, z);
    }
    for (char c : s) ans += lets[c - 'a'];
    //glob[x][y][z] = ans;
    return ans;
}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); 
    srand((unsigned)chrono::high_resolution_clock::now().time_since_epoch().count());
    int x, y, z;
    cin >> x >> y >> z;
    cout << solve(x, y, z) << '\n';
    /*
    forn(x, 0, 6) forn(y, 0, 6) forn(z, 0, 6) {
        string s1 = solve(x, y, z), s2 = brute(x, y, z);
        if (s1 != s2) {
            cout << "ERROR!: " << x << ' ' << y << ' ' << z << '\n';
            cout << s1 << ' ' << s2 << '\n';
            return 0;
        }
    }*/
    //int x = 4, y = 2, z = 3;
    //cout << solve(x, y, z) << '\n';
}


Measured memory_bytes: 256