#include <bits/stdc++.h>
using namespace std;
void ga(int N, int *A) {
  for (int i(0); i < N; i++) scanf("%d", A + i);
}
struct lt {
  char c;
  long long T;
  bool operator<(const lt &r) const { return c != r.c ? T < r.T : c < r.c; }
  bool operator==(const lt &r) const { return c == r.c && T == r.T; }
  bool operator!=(const lt &r) const { return c != r.c || T != r.T; }
} T[(1 << 20)], P[(1 << 20)], I[(1 << 20)];
long long S;
void preKMP(lt *p, int *f) {
  *f = -1;
  for (int i(1), k; p[i + 1].c; ++i) {
    k = f[i - 1];
    while (~k && p[k] != p[i - 1]) k = f[k];
    f[i] = k + 1;
  }
}
int N, M, n, m, a;
int sm(int b) {
  if (!b) return 0;
  if (T[b - 1].c != P[0].c || T[b - 1].T < P[0].T) return 0;
  if (T[b + m - 2].c != P[m - 1].c || T[b + m - 2].T < P[m - 1].T) return 0;
  return 1;
}
void KMP(lt *p, lt *t, int m) {
  static int f[(1 << 20)];
  preKMP(p, f);
  for (int i(0), k(0); t[i].c;)
    if (!~k)
      ++i, k = 0;
    else if (t[i] == p[k]) {
      ++i;
      if (++k == m) S += sm(i - k), k = f[k - 1], --i;
    } else
      k = f[k];
}
char c;
int main(void) {
  scanf("%d%d", &N, &M);
  for (int i(0); i < N; i++) {
    scanf("%d-%c", &a, &c);
    if (i && T[n - 1].c == c)
      T[n - 1].T += a;
    else
      T[n++] = {c, a};
  }
  T[n].c = 0;
  for (int i(0); i < M; i++) {
    scanf("%d-%c", &a, &c);
    if (i && P[m - 1].c == c)
      P[m - 1].T += a;
    else
      P[m++] = {c, a};
  }
  P[m].c = 0;
  if (m == 1) {
    for (int i(0); i < n; i++)
      if (T[i].c == P[0].c) S += max(0ll, T[i].T - P[0].T + 1);
  } else if (m == 2)
    for (int i(0); i < n - 1; i++)
      S += T[i].c == P[0].c && T[i].T >= P[0].T && T[i + 1].c == P[1].c &&
           T[i + 1].T >= P[1].T;
  else if (m == 3)
    for (int i(0); i < n - 1; i++)
      S += T[i + 1] == P[1] && T[i].c == P[0].c && T[i].T >= P[0].T &&
           T[i + 2].c == P[2].c && T[i + 2].T >= P[2].T;
  else
    KMP(P + 1, T, m - 2);
  printf("%lld\n", S);
  return 0;
}
