//header{{{
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/tag_and_trait.hpp>
#include <ext/pb_ds/trie_policy.hpp>
 
using namespace __gnu_pbds;
using namespace std;
 
#define rep(i,n) for(int i=0;i<(n);++i)
#define reps(i,n) for(int i=1;i<=(n);++i)
#define all(x) begin(x),end(x)
#define Fixed fixed << setprecision(12)
#define int int_fast64_t
using pii = pair<int,int>;
constexpr int INF  = 0x3f3f3f3f;
constexpr long long LINF = 0x3f3f3f3f3f3f3f3fLL;
constexpr int mod1 = 1e9+7;
constexpr int mod2 = 998244353;
 
template <class Func>
class FixPoint : Func {
public:
    explicit constexpr FixPoint(Func&& f) noexcept : Func(forward<Func>(f)) {}
 
    template <class... Args>
    constexpr decltype(auto) operator()(Args&&... args) const {
        return Func::operator()(*this, std::forward<Args>(args)...);
    }
};
 
template <class Func>
static inline constexpr decltype(auto) makeFixPoint(Func&& f) noexcept {
    return FixPoint<Func>{forward<Func>(f)};
}
 
template <class A, class B> inline bool chmax(A &a, const B &b) { return b > a && (a = b, true); }
template <class A, class B> inline bool chmin(A &a, const B &b) { return b < a && (a = b, true); }
 
template <class T> using min_heap = priority_queue<T,vector<T>,greater<T> >;
template <class T> using max_heap = priority_queue<T>;
template <class A, class B> using umap = unordered_map<A,B>;
template <class T> using Set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <class K, class V> using Umap = gp_hash_table<K, V>;
using Trie = trie<string, null_type, trie_string_access_traits<>, pat_trie_tag, trie_prefix_search_node_update>;
 
inline int square(int a){ return a * a;}
inline int updiv(int a,int b){ return (a + b - 1) / b; }
 
constexpr int dx[] = {1,0,-1,0,1,1,-1,-1};
constexpr int dy[] = {0,-1,0,1,1,-1,-1,1};
//}}}
 

signed main(){
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    cout.setf(ios_base::fixed);
    cout.precision(10);

    string s, t;
    cin >> s >> t;

    vector<set<int> > pos(26);
    vector<bool> char_s(26);

    rep(i,size(s)){
        pos[s[i] - 'a'].insert(i);
        char_s[s[i] - 'a'] = true;
    }
    rep(i,size(t)){
        if(!char_s[t[i] - 'a']){
            return cout << -1 << '\n', 0;
        }
    }

    auto Isok = [&](int len) -> bool {
        int lp = len / size(s);
        int cnt = 0, idx = 0;
        for(auto&& e : t){
            int c = e - 'a';
            while(true){
                auto itr = pos[c].lower_bound(idx);
                if(itr == pos[c].end()){
                    ++cnt;
                    idx = 0;
                    if(cnt > lp) return (false);
                }else{
                    idx = *itr + 1;
                    break;
                }
            }
        }
        if(cnt * size(s) + idx - 1 > len){
            return (false); 
        }else{
            return (true);
        }
    };

    int ng = -1, ok = (int)size(s) * size(t) + 1;
    while(ok - ng > 1){
        int mid = (ok + ng) / 2;
        if(Isok(mid)) ok = mid;
        else ng = mid;
    }

    if(ok == (int)size(s) * size(t) + 1){
        cout << -1 << '\n';
    }else{
        cout << ok + 1 << '\n';
    }

    return 0;
}

Measured memory_bytes: 8528