#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
typedef struct BL {
  long long v;
  char ch;
  friend bool operator==(BL a, BL b) { return a.ch == b.ch && a.v == b.v; }
  friend bool operator!=(BL a, BL b) { return !(a == b); }
} BL;
BL b[maxn];
int n, m;
int f[maxn];
BL T1, T2;
void getFail(BL* P) {
  f[0] = 0;
  f[1] = 0;
  for (int i = 1; i < m; i++) {
    int j = f[i];
    while (j && P[i] != P[j]) {
      j = f[j];
    }
    f[i + 1] = P[i] == P[j] ? j + 1 : 0;
  }
}
long long find(BL* T, BL* P) {
  long long ret = 0;
  getFail(P);
  int j = 0;
  for (int i = 0; i < n - 1; i++) {
    while (j && P[j] != T[i]) {
      j = f[j];
    }
    if (P[j] == T[i]) {
      j++;
    }
    if (j == m) {
      if (i - m >= 0 && T[i - m].ch == T1.ch && T[i - m].v >= T1.v &&
          T[i + 1].ch == T2.ch && T[i + 1].v >= T2.v)
        ret++;
      j = f[j];
    }
  }
  return ret;
}
BL T[maxn], P[maxn];
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    scanf("%I64d-%c", &T[i].v, &T[i].ch);
    if (i && T[i].ch == T[i - 1].ch) {
      T[i - 1].v += T[i].v;
      i--;
      n--;
    }
  }
  for (int i = 0; i < m; i++) {
    scanf("%I64d-%c", &P[i].v, &P[i].ch);
    if (i && P[i].ch == P[i - 1].ch) {
      P[i - 1].v += P[i].v;
      i--;
      m--;
    }
  }
  long long ret = 0;
  if (m == 1) {
    for (int i = 0; i < n; i++) {
      if (T[i].ch == P[0].ch && T[i].v >= P[0].v) ret += T[i].v - P[0].v + 1;
    }
    cout << ret << endl;
  } else if (m == 2) {
    for (int i = 0; i < n - 1; i++) {
      if (T[i].ch == P[0].ch && T[i].v >= P[0].v && T[i + 1].ch == P[1].ch &&
          T[i + 1].v >= P[1].v)
        ret++;
    }
    cout << ret << endl;
  } else {
    T1 = P[0], T2 = P[m - 1];
    for (int i = 1; i < m; i++) {
      P[i - 1] = P[i];
    }
    m -= 2;
    cout << find(T, P) << endl;
  }
  return 0;
}
