#include <bits/stdc++.h>   using namespace std;   template <class T>   bool remin(T &a, const T &b) {     if (a > b) {       a = b;       return true;     }     return false;   }   template <class T>   bool remax(T &a, const T &b) {     if (a < b) {       a = b;       return true;     }     return false;   }   int nxt() {     int first;     scanf( %  PRId32, &first);     return first;   }   long long nxtll() {     long long first;     scanf( %  PRId64, &first);     return first;   }   long long gcd(long long a, long long b) {     a = abs(a);     b = abs(b);     while (b) {       a %= b;       swap(a, b);     }     return a;   }   struct Q {     long long n, d;     Q(long long a = 0) : n(a), d(1) {}     Q(long long nn, long long dd) : n(nn), d(dd) { norm(); }     void norm() {       long long g = gcd(abs(n), abs(d));       n /= g;       d /= g;       if (d < 0) {         n *= -1;         d *= -1;       }     }     Q operator+(const Q &r) const { return Q(n * r.d + d * r.n, d * r.d); }     Q operator-(const Q &r) const { return Q(n * r.d - d * r.n, d * r.d); }     Q operator*(const Q &r) const { return Q(n * r.n, d * r.d); }     Q operator/(const Q &r) const { return Q(n * r.d, d * r.n); }     long long value(const Q &r) const { return n * r.d - d * r.n; }     double vald(const Q &r) const { return n * 1.0 * r.d - d * 1.0 * r.n; }     bool operator<(const Q &r) const {       double vv = vald(r);       if (vv < -1e10) {         return true;       }       if (vv > 1e10) {         return false;       }       return value(r) < 0;     }     bool operator>(const Q &r) const {       double vv = vald(r);       if (vv < -1e10) {         return false;       }       if (vv > 1e10) {         return true;       }       return value(r) > 0;     }     bool operator!=(const Q &r) const { return !(*this == r); }     bool operator>=(const Q &r) const { return *this > r || *this == r; }     bool operator<=(const Q &r) const { return *this < r || *this == r; }     bool operator==(const Q &r) const {       double vv = vald(r);       if (vv < -1e10) {         return false;       }       if (vv > 1e10) {         return false;       }       return value(r) == 0;     }     double getValue() const { return n / (double)d; }   };   ostream &operator<<(ostream &os, const Q &p) { return os << p.n <<  /  << p.d; }   struct pt {     double first, second;     pt() = default;     pt(long double first, long double second) : first(first), second(second) {}     inline pt operator-(const pt &r) const {       return pt(first - r.first, second - r.second);     }     inline pt operator+(const pt &r) const {       return pt(first + r.first, second + r.second);     }     inline pt operator*(const long double &r) const {       return pt(first * r, second * r);     }     inline pt operator-() const { return pt(-first, -second); }     inline long double sqlen() const {       return fabsl(first * first + second * second);     }   };   ostream &operator<<(ostream &os, const pt &p) {     return os <<  (  << p.first <<  ,  << p.second <<  ) ;   }   ostream &operator<<(ostream &os, const pair<long long, long long> &p) {     return os <<  (  << p.first <<  ,  << p.second <<  ) ;   }   pair<long long, long long> operator-(const pair<long long, long long> &l,                                        const pair<long long, long long> &r) {     return pair<long long, long long>(l.first - r.first, l.second - r.second);   }   pair<long long, long long> operator+(const pair<long long, long long> &l,                                        const pair<long long, long long> &r) {     return pair<long long, long long>(l.first + r.first, l.second + r.second);   }   inline double cross(const pt &l, const pt &r) {     return l.first * r.second - l.second * r.first;   }   inline double dot(const pt &l, const pt &r) {     return l.first * r.first + l.second * r.second;   }   inline long long cross(const pair<long long, long long> &l,                          const pair<long long, long long> &r) {     return l.first * r.second - l.second * r.first;   }   inline long long dot(const pair<long long, long long> &l,                        const pair<long long, long long> &r) {     return l.first * r.first + l.second * r.second;   }   long long pwmod(long long a, long long n, long long mod) {     long long ret = 1;     while (n) {       if (n & 1) ret = ret * a % mod;       a = a * a % mod;       n >>= 1;     }     return ret;   }   template <typename T>   inline T sqr(T first) {     return first * first;   }   inline bool is_prime(unsigned long long first) {     for (unsigned long long i = 2; i * i <= first; ++i) {       if (first % i == 0) {         return false;       }     }     return true;   }   bool is_sq(long long first) {     for (long long i = 1; i * i <= first; ++i) {       if (i * i == first) return true;     }     return false;   }   int n;   string solve(const multiset<char> &a, const multiset<char> &b, int d = 0,                const string &cur = string(n,  ? )) {     if (d == n) {       return cur;     }     if (d & 1) {       string res =   ;       set<char> bl(b.begin(), b.end());       for (char c : bl) {         multiset<char> bb = b;         bb.erase(bb.find(c));         for (int i = 0; i < n; ++i) {           if (cur[i] !=  ? ) continue;           string cc = cur;           cc[i] = c;           res = max(res, solve(a, bb, d + 1, cc));         }       }       return res;     } else {       string res = string(n,  z  + 1);       set<char> al(a.begin(), a.end());       for (char c : al) {         multiset<char> aa = a;         aa.erase(aa.find(c));         for (int i = 0; i < n; ++i) {           if (cur[i] !=  ? ) continue;           string cc = cur;           cc[i] = c;           res = min(res, solve(aa, b, d + 1, cc));         }       }       return res;     }   }   string solve(const string &a, const string &b) {     n = a.length();     return solve(multiset<char>(a.begin(), a.end()),                  multiset<char>(b.begin(), b.end()));   }   const int N = 300 * 1000 + 10;   char a[N];   char b[N];   string solve2(string a, string b) {     sort(a.begin(), a.end());     sort(b.begin(), b.end());     int n = a.length();     int l = 0, r = n - 1;     int L = 0, R = n;     string s(n,  . );     int move = 0;     while (L < R) {       if (move & 1) {         if (a[l] < b[r] || L + 1 == R) {           s[L] = b[r];           --r;           ++L;         } else {           if (!((R - L) & 1)) {             for (int i = L; i < R; i += 2) {               s[i] = a[l++];             }             for (int i = L + 1; i < R; i += 2) {               s[i] = b[r--];             }           } else {             for (int i = L + 1; i < R; i += 2) {               s[i] = a[l++];             }             for (int i = L; i < R; i += 2) {               s[i] = b[r--];             }           }           L = R;         }       } else {         if (a[l] < b[r] || L + 1 == R) {           s[L] = a[l];           ++l;           ++L;         } else {           if (!((R - L) & 1)) {             for (int i = L + 1; i < R; i += 2) {               s[i] = a[l++];             }             for (int i = L; i < R; i += 2) {               s[i] = b[r--];             }           } else {             for (int i = L; i < R; i += 2) {               s[i] = a[l++];             }             for (int i = L + 1; i < R; i += 2) {               s[i] = b[r--];             }           }           L = R;         }       }       ++move;     }     return s;   }   void solve() {     scanf( %s , a);     scanf( %s , b);     cout << solve2(a, b) <<   n ;   }   void prepare() {     return;     while (true) {       n = rand() % 5 + 1;       string a(n,  . );       string b(n,  . );       for (int i = 0; i < (int)(n); i++) {         a[i] = rand() % 5 +  a ;         b[i] = rand() % 5 +  a ;       }       if (solve(a, b) != solve2(a, b)) {         cout << a <<   n ;         cout << b <<   n ;         return;       }     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     prepare();     int t = 1;     for (int i = 0; i < (int)(t); i++) {       solve();     }     cerr <<  Time   << clock() / (double)CLOCKS_PER_SEC << endl;     return 0;   }