using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using static Input;
using static Util;
class Program
{
    static string S;
    static string T;
    static void INPUT()
    {
        S = NextString();
        T = NextString();
    }
    static void OUTPUT()
    {
        var SS = (S + S).ToCharArray();
        var d = new List<List<int>>();
        var sl = S.Length;
        for (int i = 0; i < 26; i++)
            d.Add(new List<int>());

        for (int i = 0; i < SS.Length; i++)
            d[SS[i] - 'a'] .Add(i+1);

        var dic = new Dictionary<int, int[]>();
        for (int i = 0; i < 26; i++)
        {
            dic[i] = d[i].ToArray();
        }
        var ans = 0L;
        var p = 0;

        foreach (var c in T)
        {
            var cc = c - 'a';
            if (dic[cc].Count() == 0)
            {
                Console.WriteLine(-1);
                return;
            }
        }

        foreach (var c in T)
        {
            var cc = c - 'a';
            //p = d[cc].FirstOrDefault(__ => __ > p);
            p = dic[cc][LowerBound<int>(dic[cc], p + 1)];
            if (p > sl)
            {
                ans += sl;
                p -= sl;
            }
        }
        ans += p;
        Console.WriteLine(ans);
    }
    static void Main(string[] args)
    {
#if DEBUG  
        TESTINPUT();
#else
        //TESTINPUT();
        INPUT();
#endif
        OUTPUT();
    }

    static void TESTINPUT()
    {
        //programming
        //sentence
    }
}

public class Input
{
    public const long MOD = 1000000007;
    public const int INF = 1000000007;
    private static Queue<string> q = new Queue<string>();
    private static void Confirm() { if (q.Count == 0) foreach (var s in Console.ReadLine().Split(' ')) q.Enqueue(s); }
    public static int NextInt() { Confirm(); return int.Parse(q.Dequeue()); }
    public static long NextLong() { Confirm(); return long.Parse(q.Dequeue()); }
    public static string NextString() { Confirm(); return q.Dequeue(); }
    public static double NextDouble() { Confirm(); return double.Parse(q.Dequeue()); }
    public static int[] LineInt() { return Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); }
    public static long[] LineLong() { return Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); }
    public static string[] LineString() { return Console.ReadLine().Split(' ').ToArray(); }
    public static double[] LineDouble() { return Console.ReadLine().Split(' ').Select(double.Parse).ToArray(); }
}

class Util
{
    /// <summary>
    /// 指定した値以上の先頭のインデクスを返す
    /// </summary>
    /// <typeparam name="T">比較する値の型</typeparam>
    /// <param name="arr">対象の配列（※ソート済みであること）</param>
    /// <param name="start">開始インデクス [inclusive]</param>
    /// <param name="end">終了インデクス [exclusive]</param>
    /// <param name="value">検索する値</param>
    /// <param name="comparer">比較関数(インターフェイス)</param>
    /// <returns>指定した値以上の先頭のインデクス</returns>
    public static int LowerBound<T>(T[] arr, int start, int end, T value, IComparer<T> comparer)
    {
        int low = start;
        int high = end;
        int mid;
        while (low < high)
        {
            mid = ((high - low) >> 1) + low;
            if (comparer.Compare(arr[mid], value) < 0)
                low = mid + 1;
            else
                high = mid;
        }
        return low;
              
    }

    //引数省略のオーバーロード
    public static int LowerBound<T>(T[] arr, T value) where T : IComparable
    {
        return LowerBound<T>(arr, 0, arr.Length, value, Comparer<T>.Default);
    }
}




Measured memory_bytes: 18784