#include <bits/stdc++.h>
using namespace std;
string minWindow(string S, string T) {
// Do not write main() function.
// Do not read input, instead use the arguments to the function.
// Do not print the output, instead return values as specified
// Still have a doubt. Checkout www.interviewbit.com/pages/sample_codes/ for more details
unordered_map<char, int> char_count;
int unique_char = 0;
for (int i = 0; i < T.size(); i++) {
if (char_count[T[i]] == 0) {
unique_char++;
}
char_count[T[i]]++;
}
int min_length = INT_MAX;
int left_index = -1;
int right_index = -1;
int j = 0;
for (; j < S.size(); j++) {
if (char_count.find(S[j]) != char_count.end()) {
char_count[S[j]]--;
if (char_count[S[j]] == 0) {
unique_char--;
if (unique_char == 0) {
if ((j + 1) < min_length) {
min_length = j + 1;
left_index = 0;
right_index = j;
}
break;
}
}
}
}
j++;
// cout << "I reached here\n" << std::flush;
int i = 0;
while (i < S.size() && j < S.size()) {
while (char_count.find(S[i]) == char_count.end() && char_count[S[i]] == 0) {
if (char_count.find(S[i]) != char_count.end()) {
char_count[S[i]]++;
cout << "Indie i " << S[i] << " " << char_count[S[i]] << endl;
}
i++;
}
cout << i << " " << S[i] << endl << std::flush;
char_count[S[i]]++;
while (char_count[S[i]] != 0) {
if (char_count.find(S[j]) != char_count.end()) {
char_count[S[j]]--;
cout << S[j] << " " << char_count[S[j]] << endl;
}
// cout << j << " " << S[j] << " " << char_count[S[i]] << endl;
j++;
}
// exit(1);
cout << j << endl << std::flush;
if (char_count[S[i]] != 0) {
break;
}
i++;
if ((j - i) < min_length) {
min_length = j - i;
left_index = i;
right_index = j - 1;
}
}
string sol = "";
if (left_index != -1) {
for (int i = left_index; i <= right_index; i++) {
sol += S[i];
}
}
return sol;
}
int main() {
// your code goes here
string S, T;
cin >> S;
cin >> T;
cout << minWindow(S, T) << endl;
return 0;
}