#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
struct HASH {
  long H1;
  HASH(long long H1 = 0, long long H2 = 0) { this->H1 = H1; }
};
char Str[2007 + 7];
long long Len;
long long N;
long long HS1[2007 + 7];
long long HS2[2007 + 7];
long long Pow1[2007 + 7];
long long Pow2[2007 + 7];
long long Inv1[2007 + 7];
long long Inv2[2007 + 7];
long long BASE1 = 47;
long long BASE2 = 47;
long long MOD1 = 1000000007;
long long MOD2 = 1000000007;
bool operator<(const HASH &a, const HASH &b) { return a.H1 < b.H1; }
bool operator==(const HASH &a, const HASH &b) { return a.H1 == b.H1; }
void SetHash(void) {
  long long i;
  for (i = 1; i <= Len; i++) {
    HS1[i] = (Str[i] * Pow1[i]) % MOD1;
    HS2[i] = (Str[i] * Pow2[i]) % MOD2;
  }
  for (i = 1; i <= Len; i++) {
    HS1[i] = (HS1[i] + HS1[i - 1]) % MOD1;
    HS2[i] = (HS2[i] + HS2[i - 1]) % MOD2;
  }
}
long long Pow(long long a, long long p, long long m) {
  if (!p)
    return 1;
  else if (p & 1) {
    return (Pow(a, p - 1, m) * a) % m;
  } else {
    long long v = Pow(a, p / 2, m);
    return (v * v) % m;
  }
}
int main(void) {
  long long i, j, v, l, h, H1, H2, Icase, k = 0;
  Pow1[0] = Inv1[0] = 1;
  Pow2[0] = Inv2[0] = 1;
  for (i = 1; i <= 2007; i++) {
    Pow1[i] = (BASE1 * Pow1[i - 1]) % MOD1;
    Inv1[i] = Pow(Pow1[i], MOD1 - 2, MOD1);
    Pow2[i] = (BASE2 * Pow2[i - 1]) % MOD2;
    Inv2[i] = Pow(Pow2[i], MOD2 - 2, MOD2);
  }
  scanf("%s", &Str[1]);
  Len = strlen(&Str[1]);
  SetHash();
  vector<HASH> Subs;
  for (i = 1; i <= Len; i++) {
    for (j = i; j <= Len; j++) {
      H1 = (HS1[j] - HS1[i - 1] + MOD1) % MOD1;
      H1 = (H1 * Inv1[i]) % MOD1;
      H2 = (HS2[j] - HS2[i - 1] + MOD2) % MOD2;
      H2 = (H2 * Inv2[i]) % MOD2;
      Subs.push_back(HASH(H1, H2));
    }
  }
  sort(Subs.begin(), Subs.end());
  Subs.resize(unique(Subs.begin(), Subs.end()) - Subs.begin());
  vector<bool> NtP(Subs.size());
  scanf("%I64d", &N);
  for (k = 1; k <= N; k++) {
    scanf("%s%I64d%I64d", &Str[1], &l, &h);
    Len = strlen(&Str[1]);
    SetHash();
    map<HASH, long long> Cnt;
    for (i = 1; i <= Len; i++) {
      for (j = i; j <= Len; j++) {
        H1 = (HS1[j] - HS1[i - 1] + MOD1) % MOD1;
        H1 = (H1 * Inv1[i]) % MOD1;
        H2 = (HS2[j] - HS2[i - 1] + MOD2) % MOD2;
        H2 = (H2 * Inv2[i]) % MOD2;
        Cnt[HASH(H1, H2)]++;
      }
    }
    for (i = 0; i < Subs.size(); i++) {
      if (NtP[i]) continue;
      if (Cnt.find(Subs[i]) == Cnt.end())
        v = 0;
      else
        v = Cnt[Subs[i]];
      if (v < l || v > h) {
        NtP[i] = true;
        continue;
      }
    }
  }
  long long Ans = 0;
  for (i = 0; i < Subs.size(); i++) {
    if (NtP[i]) continue;
    Ans++;
  }
  printf("%I64d\n", Ans);
  return 0;
}
