#include <bits/stdc++.h>
const int MAXN = 2e5 + 10;
const double eps = 1e-8;
const int mod1 = 1e9 + 7;
const int mod2 = 1e9 + 9;
using namespace std;
struct edge {
  int t, v;
  edge *next;
} e[MAXN << 1], *h[MAXN], *o = e;
void add(int x, int y, int vul) {
  o->t = y;
  o->v = vul;
  o->next = h[x];
  h[x] = o++;
}
long long read() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return x * f;
}
typedef struct node {
  char ch;
  long long num;
} node;
node d1[MAXN], d2[MAXN];
long long sum1[MAXN], sum2[MAXN];
long long ksm(long long a, long long b, long long c) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = ans * a % c;
    a = a * a % c;
    b = b >> 1;
  }
  return ans;
}
void Hash(int len) {
  for (int i = 1; i <= len; i++) {
    sum1[i] = (sum1[i - 1] * 131 % mod1 +
               ksm(ksm(131, d1[i].num, mod1), d1[i].ch, mod1)) %
              mod1;
    sum2[i] = (sum2[i - 1] * 233 % mod2 +
               ksm(ksm(233, d1[i].num, mod2), d1[i].ch, mod2)) %
              mod2;
  }
}
int main() {
  int n = read(), m = read();
  int cnt1 = 0, cnt2 = 0;
  for (int i = 1; i <= n; i++) {
    int t;
    char ch;
    scanf("%d-%c", &t, &ch);
    if (i == 1 || ch != d1[cnt1].ch)
      d1[++cnt1] = (node){ch, t};
    else
      d1[cnt1].num += t;
  }
  for (int i = 1; i <= m; i++) {
    int t;
    char ch;
    scanf("%d-%c", &t, &ch);
    if (i == 1 || ch != d2[cnt2].ch)
      d2[++cnt2] = (node){ch, t};
    else
      d2[cnt2].num += t;
  }
  Hash(cnt1);
  long long base1 = 0, base2 = 0;
  for (int i = 2; i <= cnt2 - 1; i++) {
    base1 =
        (base1 * 131 % mod1 + ksm(ksm(131, d2[i].num, mod1), d2[i].ch, mod1)) %
        mod1;
    base2 =
        (base2 * 233 % mod2 + ksm(ksm(233, d2[i].num, mod2), d2[i].ch, mod2)) %
        mod2;
  }
  long long ans = 0;
  for (int i = 1; i <= cnt1; i++) {
    if (i + cnt2 - 1 > n) break;
    if (d1[i].ch == d2[1].ch && d1[i].num >= d2[1].num) {
      if (cnt2 == 1) {
        ans += d1[i].num - d2[1].num + 1;
        continue;
      }
      if (cnt2 == 2) {
        if (d1[i + 1].ch == d2[2].ch && d1[i + 1].num >= d2[2].num) {
          ans++;
        }
        continue;
      }
      int t1 = i + 1;
      int t2 = i + cnt2 - 2;
      long long tt1 =
          (sum1[t2] - sum1[t1 - 1] * ksm(131, t2 - i, mod1) % mod1 + mod1) %
          mod1;
      long long tt2 =
          (sum2[t2] - sum2[t1 - 1] * ksm(233, t2 - i, mod2) % mod2 + mod2) %
          mod2;
      if (tt1 != base1 || tt2 != base2) continue;
      if (d1[i + cnt2 - 1].ch == d2[cnt2].ch &&
          d1[i + cnt2 - 1].num >= d2[cnt2].num)
        ans++;
    }
  }
  printf("%lld\n", ans);
}
