#include <iostream>

using namespace std;

string uporedi(string a, string b, string c);

int main(int argc, const char * argv[]) {
    string a, b, c;
    cin >> a >> b >> c;
    string max = uporedi(a, b, c);
    cout << max << endl;
    return 0;
}

string uporedi(string a, string b, string c){
    /*--------zapisivanje duzina stringova a,b i c i deklarisanje varijabli--------*/
    bool bl = false;
    int i;
    int d, dm;
    string max;
    string lefty;
    string max2 = c;
    string nd;
    string nk;
    /*--------min(d(a),d(b))--------*/
    if(a.size() > b.size()){
        nd = a;
        nk = b;
        d = b.size();
        dm = a.size();
    }
    else{
        nd = b;
        nk = a;
        d = a.size();
        dm = b.size();
    }
    /*--------da li je bolji a ili b na prvom mestu--------*/
    for(i = 0; i < d; ++i){
        if(a[i] > b[i]){
            max = a;
            lefty = b;
            bl = true;
            break;
        }
        if(b[i] > a[i]){
            max = b;
            lefty = a;
            bl = true;
            break;
        }
    }
    if(!bl){
        while (i < dm){
            if(nd[i] > c[i-d]){
                max = nd;
                lefty = nk;
                bl = true;
                break;
            }
            if(c[i-d] > nd[i]){
                max = nk;
                lefty = nd;
                bl = true;
                break;
            }
            ++i;
        }
    }
    if(!bl){
        max = nd;
        lefty = nk;
    }
    /*--------min(d(max),d(c))--------*/
    bl = false;
    if(max.size() > max2.size()){
        d = max2.size();
        dm = max.size();
        nd = max;
        nk = max2;
    }
    else{
        d = max.size();
        dm = max2.size();
        nd = max2;
        nk = max;
    }
    /*--------da li je bolji max ili c na prvom mestu--------*/
    for(int i = 0; i < d; ++i){
        if(max[i] > max2[i]){
            bl = true;
            break;
        }
        if(max2[i] > max[i]){
            c = max;
            max = max2;
            max2 = c;
            bl = true;
            break;
        }
    }
    if(!bl){
        while (i < dm){
            if(nd[i] > lefty[i-d]){
                max = nd;
                max2 = nk;
                bl = true;
                break;
            }
            if(lefty[i-d] > nd[i]){
                max = nk;
                max2 = nd;
                bl = true;
                break;
            }
            ++i;
        }
    }
    /*--------min(d(max2),d(lefty))--------*/
    if(lefty.size() > max2.size()){
        d = max2.size();
        dm = lefty.size();
        nd = lefty;
        nk = max2;
    }
    else{
        d = lefty.size();
        dm = max2.size();
        nd = max2;
        nk = lefty;
    }
    /*--------da li je bolji max2 ili lefty na drugom mestu--------*/
    for(int i = 0; i < d; ++i){
        if(lefty[i] > max2[i]){
            bl = true;
            break;
        }
        if(max2[i] > lefty[i]){
            c = lefty;
            lefty = max2;
            max2 = c;
            bl = true;
            break;
        }
    }
    if(!bl){
        while (i < dm){
            if(nd[i] > nd[i-d]){
                lefty = nd;
                max2 = nk;
                bl = true;
                break;
            }
            if(nd[i-d] > nd[i]){
                lefty = nk;
                max2 = nd;
                bl = true;
                break;
            }
            ++i;
        }
    }
    /*--------rezultat--------*/
    return max + lefty + max2;
}