#include <bits/stdc++.h>
using namespace std;
char buf[1000002];
int cntt[26];
string t;
vector<int> ans;
vector<int> ans1;
vector<int> ans2;
void leading() {
  ans1.clear();
  for (int i = 0; i < t.size(); i++) {
    ans1.push_back(t[i] - '0');
  }
  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < cntt[i]; j++) {
      ans1.push_back(i);
    }
  }
}
void leading2() {
  ans2.clear();
  int id = 0;
  for (int i = 1; i < 10; i++) {
    if (cntt[i]) {
      ans2.push_back(i);
      cntt[i]--;
      id = i;
      break;
    }
  }
  int be = t[0] - '0';
  for (int i = 0; i < be; i++) {
    for (int j = 0; j < cntt[i]; j++) {
      ans2.push_back(i);
    }
  }
  int las = INT_MAX;
  for (int i = 1; i < t.size(); i++) {
    if (t[i] != t[i - 1]) {
      las = t[i] - '0';
      break;
    }
  }
  if (be > las) {
    for (int k = 0; k < t.size(); k++) {
      ans2.push_back(t[k] - '0');
    }
    for (int k = 0; k < cntt[be]; k++) {
      ans2.push_back(be);
    }
  } else {
    for (int k = 0; k < cntt[be]; k++) {
      ans2.push_back(be);
    }
    for (int k = 0; k < t.size(); k++) {
      ans2.push_back(t[k] - '0');
    }
  }
  for (int k = be + 1; k < 10; k++) {
    for (int j = 0; j < cntt[k]; j++) {
      ans2.push_back(k);
    }
  }
  if (id) {
    cntt[id]++;
  }
}
vector<vector<int> > vv;
bool valid(vector<int> &A) {
  if (A.size() > 1 && A[0] == 0) {
    return false;
  }
  return true;
}
int main() {
  scanf("%s", buf);
  int N = strlen(buf);
  for (int i = 0; i < N; i++) {
    cntt[buf[i] - '0']++;
  }
  scanf("%s", buf);
  t = buf;
  for (int i = 0; i < t.size(); i++) {
    cntt[t[i] - '0']--;
  }
  long long int L = 1;
  long long int NUM = 1;
  int cnt = 0;
  while (1) {
    if (NUM >= L) {
      cnt++;
      L *= 10LL;
    }
    if (N - cnt == NUM) {
      int C = NUM;
      vector<int> v;
      bool ng = false;
      while (C) {
        v.push_back(C % 10);
        cntt[C % 10]--;
        if (cntt[C % 10] < 0) {
          ng = true;
          break;
        }
        C /= 10;
      }
      if (ng) {
        for (int i = 0; i < v.size(); i++) {
          cntt[v[i]]++;
        }
        NUM++;
        continue;
      }
      int be = t[0] - '0';
      ans.clear();
      for (int i = 0; i < be; i++) {
        for (int j = 0; j < cntt[i]; j++) {
          ans.push_back(i);
        }
      }
      int las = INT_MAX;
      for (int i = 1; i < t.size(); i++) {
        if (t[i] != t[i - 1]) {
          las = t[i] - '0';
          break;
        }
      }
      if (be > las) {
        for (int k = 0; k < t.size(); k++) {
          ans.push_back(t[k] - '0');
        }
        for (int k = 0; k < cntt[be]; k++) {
          ans.push_back(be);
        }
      } else {
        for (int k = 0; k < cntt[be]; k++) {
          ans.push_back(be);
        }
        for (int k = 0; k < t.size(); k++) {
          ans.push_back(t[k] - '0');
        }
      }
      for (int k = be + 1; k < 10; k++) {
        for (int j = 0; j < cntt[k]; j++) {
          ans.push_back(k);
        }
      }
      leading();
      leading2();
      vv.clear();
      if (valid(ans)) {
        vv.push_back(ans);
      }
      if (valid(ans1)) {
        vv.push_back(ans1);
      }
      if (valid(ans2)) {
        vv.push_back(ans2);
      }
      sort(vv.begin(), vv.end());
      if (vv.size() == 0) {
        NUM++;
        for (int i = 0; i < v.size(); i++) {
          cntt[v[i]]++;
        }
        continue;
      }
      for (int i = 0; i < vv[0].size(); i++) {
        printf("%d", vv[0][i]);
      }
      puts("");
      return 0;
    } else {
      NUM++;
      continue;
    }
  }
  return 0;
}
