#include <bits/stdc++.h>
using namespace std;
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T>
istream &operator>>(istream &is, vector<T> &vec) {
  for (auto &v : vec) is >> v;
  return is;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &vec) {
  for (int i = 0; i < vec.size(); i++) {
    os << vec[i];
    if (i + 1 != vec.size()) os << " ";
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &st) {
  for (auto itr = st.begin(); itr != st.end(); ++itr) {
    os << *itr;
    auto titr = itr;
    if (++titr != st.end()) os << " ";
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_set<T> &st) {
  for (auto itr = st.begin(); itr != st.end(); ++itr) {
    os << *itr;
    auto titr = itr;
    if (++titr != st.end()) os << " ";
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const multiset<T> &st) {
  for (auto itr = st.begin(); itr != st.end(); ++itr) {
    os << *itr;
    auto titr = itr;
    if (++titr != st.end()) os << " ";
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_multiset<T> &st) {
  for (auto itr = st.begin(); itr != st.end(); ++itr) {
    os << *itr;
    auto titr = itr;
    if (++titr != st.end()) os << " ";
  }
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const map<T1, T2> &mp) {
  for (auto itr = mp.begin(); itr != mp.end(); ++itr) {
    os << "(" << itr->first << ", " << itr->second << ")";
    auto titr = itr;
    if (++titr != mp.end()) os << " ";
  }
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const unordered_map<T1, T2> &mp) {
  for (auto itr = mp.begin(); itr != mp.end(); ++itr) {
    os << "(" << itr->first << ", " << itr->second << ")";
    auto titr = itr;
    if (++titr != mp.end()) os << " ";
  }
  return os;
}
using ll = long long int;
using P = pair<int, int>;
const int inf = 1e9;
const ll linf = 1LL << 50;
const double EPS = 1e-10;
const int mod = 1000000007;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, -1, 0, 1};
struct fast_io {
  fast_io() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(20);
  }
} fast_io_;
int main(int argc, char const *argv[]) {
  string a, b;
  cin >> a >> b;
  vector<int> s(((int)(b).size())), t(((int)(b).size()));
  for (int i = (0); i < (((int)(b).size())); ++i) {
    if (i > 0 && s[i - 1] == -1) {
      s[i] = -1;
      continue;
    }
    s[i] = -1;
    for (int j = (i > 0 ? s[i - 1] + 1 : 0); j < ((int)(a).size()); j++) {
      if (a[j] == b[i]) {
        s[i] = j;
        break;
      }
    }
  }
  for (int i = ((int)(((int)(b).size())) - 1); i >= 0; i--) {
    if (i + 1 < ((int)(b).size()) && t[i + 1] == -1) {
      t[i] = -1;
      continue;
    }
    t[i] = -1;
    for (int j =
             (i + 1 < ((int)(b).size()) ? t[i + 1] - 1 : ((int)(a).size()) - 1);
         j >= 0; j--) {
      if (a[j] == b[i]) {
        t[i] = j;
        break;
      }
    }
  }
  if (s[((int)(b).size()) - 1] != -1) {
    cout << b << endl;
    return 0;
  }
  int maxi = 0, l = 0, r = 0;
  for (int i = (0); i < (((int)(b).size())); ++i) {
    if (s[i] == -1) break;
    int idx = upper_bound(t.begin() + i + 1, t.end(), s[i]) - t.begin();
    if (maxi < i + 1 + (((int)(b).size()) - idx)) {
      maxi = i + 1 + ((int)(b).size()) - idx;
      l = i, r = idx;
    }
  }
  for (int i = ((int)(((int)(b).size())) - 1); i >= 0; i--) {
    if (t[i] == -1) break;
    if (maxi < ((int)(b).size()) - i) {
      maxi = ((int)(b).size()) - i;
      l = -1, r = i;
    }
  }
  if (maxi == 0) {
    cout << "-" << endl;
  } else {
    string res = b.substr(0, l + 1) + b.substr(r, ((int)(b).size()) - r);
    cout << res << endl;
  }
  return 0;
}
