#include using namespace std; int nr, spcl, N, M, mod, ap[1009], ap2[109][109]; char sir[1009]; int dp[1000009]; map < pair < vector < int >, int >, int > mp; pair < vector < int >, int > states[1000009]; void Print (pair < vector < int > , int > x) { for (int i=0; i<26; i++) if (x.first[i] != 0) printf ("%c - %d\n", 'a' + i, x.first[i]); printf ("%c\n", x.second + 'a'); } int main() { //freopen ("input", "r", stdin); //freopen ("output", "w", stdout); gets (sir + 1), N = strlen (sir + 1), mod = 666013; for (int i=1; i<=N; i++) sir[i] -= 'a', ap[sir[i]] ++; scanf ("%d", &M); while (M --) { char c1, c2; scanf ("\n%c %c", &c1, &c2), c1 -= 'a', c2 -= 'a'; ap2[c1][c2] = ap2[c2][c1] = 1; } int knt_odd = 0; for (int i=0; i<26; i++) knt_odd += (ap[i] % 2 == 1); if (knt_odd >= 2) { printf ("0\n"); return 0; } spcl = -1; for (int i=0; i<26; i++) { if (ap[i] & 1) spcl = i; ap[i] /= 2; } vector < int > curr; for (int i=0; i<26; i++) curr.push_back (ap[i]); for (int j=0; j<26; j++) if (ap[j]) { curr[j] --; mp[make_pair (curr, j)] = ++nr, states[nr] = make_pair (curr, j), dp[nr] = 1; curr[j] ++; } for (int i=1; i<=nr; i++) { vector < int > frq = states[i].first; int lst = states[i].second; for (int j=0; j<26; j++) if (frq[j] > 0 && !ap2[lst][j]) { frq[j] --; pair < vector < int >, int > vec = make_pair (frq, j); frq[j] ++; if (!mp.count (vec)) mp[vec] = ++nr, dp[nr] = dp[i], states[nr] = vec; else { int id = mp[vec]; dp[id] += dp[i]; if (dp[id] >= mod) dp[id] -= mod; } } } //for (int i=1; i<=nr; i++) // Print (states[i]), printf ("%d\n\n", dp[i]); vector < int > gol; for (int i=0; i<26; i++) gol.push_back (0); int ans = 0; for (int i=nr; i>=1; i--) { if (states[i].first != gol) break; if (spcl == -1 || !ap2[states[i].second][spcl]) { ans += dp[i]; if (ans >= mod) ans -= mod; } } printf ("%d\n", ans); return 0; }