#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], dp[MAX_N], last[MAX_N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
freopen("SET.inp", "r", stdin);
freopen("SET.out", "w", stdout);
int n, m;
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;
}
int ans = m;
dp[n + 1] = 1;
for (int i = m, j = n; i >= 1; i--) {
while (j >= pos[i - 1] + 1) {
dp[j] = 2 * dp[j + 1] % MOD;
if (last[a[j]]) {
(dp[j] -= dp[last[a[j]] + 1] - MOD) %= MOD;
update(a[j], -dp[last[a[j]] + 1] + MOD);
}
update(a[j], dp[j + 1]);
last[a[j]] = j;
j--;
}
///get [1, b[i] - 1]
/// it.get(1, 1, n, 1, b[i] - 1)
(ans += query(b[i] - 1)) %= MOD;
}
cout << ans << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE1BWF9OID0gNTAwMDA1Owpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKCmludCB0cmVlW01BWF9OXTsKCnZvaWQgdXBkYXRlKGludCBwb3MsIGludCB2YWwpIHsKICAgIGZvciAoaW50IGkgPSBwb3M7IGkgPCBNQVhfTjsgaSArPSBpICYgLWkpIHsKICAgICAgICAodHJlZVtpXSArPSB2YWwpICU9IE1PRDsKICAgIH0KfQoKaW50IHF1ZXJ5KGludCBwb3MpIHsKICAgIGludCByZXMgPSAwOwogICAgZm9yIChpbnQgaSA9IHBvczsgaSA+IDA7IGkgLT0gaSAmIC1pKSB7CiAgICAgICAgKHJlcyArPSB0cmVlW2ldKSAlPSBNT0Q7CiAgICB9CgogICAgcmV0dXJuIHJlczsKfQoKaW50IG4sIG07CmludCBhW01BWF9OXSwgYltNQVhfTl07CmludCBwb3NbTUFYX05dLCBkcFtNQVhfTl0sIGxhc3RbTUFYX05dOwoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwogICAgY291dC50aWUoMCk7CgogICAgZnJlb3BlbigiU0VULmlucCIsICJyIiwgc3RkaW4pOwogICAgZnJlb3BlbigiU0VULm91dCIsICJ3Iiwgc3Rkb3V0KTsKCiAgICBpbnQgbiwgbTsKICAgIGNpbiA+PiBuID4+IG07CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgY2luID4+IGFbaV07CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKSB7CiAgICAgICAgY2luID4+IGJbaV07CiAgICB9CgogICAgYm9vbCBjaGsgPSBmYWxzZTsKICAgIHBvc1swXSA9IDA7CiAgICBmb3IgKGludCBpID0gMSwgaiA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgaWYgKGFbaV0gPT0gYltqXSkgewogICAgICAgICAgICBwb3Nbal0gPSBpOwogICAgICAgICAgICBpZiAoKytqID09IG0gKyAxKSB7CiAgICAgICAgICAgICAgICBjaGsgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCFjaGspIHsKICAgICAgICBjb3V0IDw8IC0xIDw8ICJcbiI7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaW50IGFucyA9IG07CiAgICBkcFtuICsgMV0gPSAxOwogICAgZm9yIChpbnQgaSA9IG0sIGogPSBuOyBpID49IDE7IGktLSkgewogICAgICAgIHdoaWxlIChqID49IHBvc1tpIC0gMV0gKyAxKSB7CiAgICAgICAgICAgIGRwW2pdID0gMiAqIGRwW2ogKyAxXSAlIE1PRDsKICAgICAgICAgICAgaWYgKGxhc3RbYVtqXV0pIHsKICAgICAgICAgICAgICAgIChkcFtqXSAtPSBkcFtsYXN0W2Fbal1dICsgMV0gLSBNT0QpICU9IE1PRDsKICAgICAgICAgICAgICAgIHVwZGF0ZShhW2pdLCAtZHBbbGFzdFthW2pdXSArIDFdICsgTU9EKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXBkYXRlKGFbal0sIGRwW2ogKyAxXSk7CiAgICAgICAgICAgIGxhc3RbYVtqXV0gPSBqOwogICAgICAgICAgICBqLS07CiAgICAgICAgfQogICAgICAgIC8vL2dldCBbMSwgYltpXSAtIDFdIAogICAgICAgIAogICAgICAgIC8vLyBpdC5nZXQoMSwgMSwgbiwgMSwgYltpXSAtIDEpIAogICAgICAgIAogICAgICAgIChhbnMgKz0gcXVlcnkoYltpXSAtIDEpKSAlPSBNT0Q7CiAgICB9CgogICAgY291dCA8PCBhbnMgPDwgIlxuIjsKCiAgICByZXR1cm4gMDsKfQoK