#include<bits/stdc++.h>
using namespace std;
// mx: độ dài tối đa chuỗi S
const int mx = 5005;
// mx_trie: Tổng số lượng ký tự của tất cả các từ trong từ điển cộng lại (10^6)
// Đây là số node tối đa có thể sinh ra.
const int mx_trie = 1e6 + 5;
const int MOD = 1e9 + 7;
string s;
int k;
int dp[mx];
// --- PHẦN TRIE MẢNG TĨNH ---
// trie[u][c]: Lưu chỉ số (ID) của node con khi đi từ node u qua cạnh c.
// Thay vì node->child[c], ta dùng trie[u][c].
// u là ID của node hiện tại (Gốc luôn là 0).
// c là ký tự (đã chuyển về số 0-25).
int trie[mx_trie][26];
// is_end[u]: Đánh dấu node có ID là u có phải là kết thúc của một từ không.
bool is_end[mx_trie];
// nodes: Biến đếm toàn cục để cấp phát ID mới cho các node.
// Ban đầu nodes = 0 (là gốc).
int nodes = 0;
// Hàm thêm từ vào Trie
void add(string &t) {
int u = 0; // Bắt đầu từ gốc (ID = 0)
for(char c : t) {
int v = c - 'a'; // Chuyển 'a'->0, 'b'->1...
// Nếu từ u chưa có đường đi v (chưa có con)
if(!trie[u][v]) {
trie[u][v] = ++nodes; // Cấp phát ID mới cho node con và gán vào
}
// Di chuyển u xuống node con
u = trie[u][v];
}
// Kết thúc vòng lặp, u đang đứng ở node cuối cùng của từ t
is_end[u] = true; // Đánh dấu đây là điểm kết thúc từ
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
if(fopen("Word_Combinations.inp","r"))
{
freopen("Word_Combinations.inp","r",stdin);
freopen("Word_Combinations.out","w",stdout);
}
cin >> s >> k;
int n = s.size();
// Đọc k từ và ném vào Trie
while(k--) {
string t;
cin >> t;
add(t);
}
// DP:
// dp[i] là số cách tạo ra tiền tố s[0...i-1]
dp[0] = 1; // Tiền tố rỗng có 1 cách
for(int i=0; i<n; ++i) {
// Nếu không thể tạo ra tiền tố đến i thì bỏ qua (nhánh cụt)
if(!dp[i]) continue;
// Bắt đầu dò từ node gốc của Trie
int u = 0;
// Dò tiếp các ký tự tiếp theo trong chuỗi S bắt đầu từ i
for(int j=i; j<n; ++j) {
int v = s[j] - 'a';
// Nếu trên Trie không có đường đi tiếp -> Không khớp từ nào -> Dừng
if(!trie[u][v]) break;
// Nhảy đến node tiếp theo
u = trie[u][v];
// Nếu tại u là điểm kết thúc của một từ trong từ điển
// Nghĩa là đoạn s[i...j] là một từ hợp lệ
if(is_end[u]) {
// Cộng dồn số cách từ dp[i] sang dp[j+1]
dp[j+1] = (dp[j+1] + dp[i]) % MOD;
}
}
}
cout << dp[n];
return 0;
}