#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 500005;
const int MOD = 1e9 + 7;

int tree[MAX_N];

void update(int pos, int val) {
    for (int i = pos; i < MAX_N; i += i & -i) {
        (tree[i] += val) %= MOD;
    }
}

int query(int pos) {
    int res = 0;
    for (int i = pos; i > 0; i -= i & -i) {
        (res += tree[i]) %= MOD;
    }

    return res;
}

int n, m;
int a[MAX_N], b[MAX_N];
int pos[MAX_N], pw2[MAX_N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    freopen("SETSEQ.inp", "r", stdin);
    freopen("SETSEQ.out", "w", stdout);

    cin >> n >> m;

    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    for (int i = 1; i <= m; i++) {
        cin >> b[i];
    }

    bool chk = false;
    pos[0] = 0;
    for (int i = 1, j = 1; i <= n; i++) {
        if (a[i] == b[j]) {
            pos[j] = i;
            if (++j == m + 1) {
                chk = true;
                break;
            }
        }
    }

    if (!chk) {
        cout << -1 << "\n";
        return 0;
    }

    pw2[0] = 1;
    for (int i = 1; i <= n; i++) {
        pw2[i] = pw2[i - 1] * 2 % MOD;
    }

    int ans = m;
    for (int i = m, j = n; i >= 1; i--) {
        while (j >= pos[i - 1] + 1) {
            update(a[j], pw2[n - j]);
            j--;
        }

        (ans += query(b[i] - 1)) %= MOD;
    }

    cout << ans << "\n";

    return 0;
}

