#include<bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;

typedef long long ll;
typedef pair<int,int> P;

struct trie{
	int to[26];
	int val;
	trie(){
		val=0;
	}
};

int size=1;
trie t[1<<19];

vector<int> make(const string& str){
	int n=str.size();
	vector<int> ret(n+1);
	ret[0]=-1;
	int j=-1;
	for(int i=0;i<n;i++){
		while(j>=0 && str[i]!=str[j]){
			j=ret[j];
		}
		ret[i+1]=++j;
	}
	return ret;
}

int now=0;
vector<int> ret[201];
int moveto[201];
int koko[201];

void kmp(const string& str,const string& word){
	vector<int> table=make(word);
	int m=0,i=0,n=str.size();
	while(m+i<n){
		if(word[i]==str[m+i]){
			if(++i==(int)(word.size())){
				ret[now].push_back(m);
				m=m+i-table[i];
				i=table[i];
			}
		}else{
			m=m+i-table[i];
			if(i>0)i=table[i];
		}
	}
}

void pushTrie(string str){
	int node=0;
	for(int i=0;i<(int)str.size();i++){
		int b=(str[i]-'a');
		if(t[node].to[b]==0){
			t[node].to[b]=size++;
		}
		node=t[node].to[b];
	}
	t[node].val++;
}

string str;
int n;
ll dp[100001];

void sendValue(int f,ll val){
	int node=0;
	for(int i=0;i<=1000;i++){
		if(i+f>=n)return;
		int b=(str[i+f]-'a');
		if(t[node].to[b]==0)return;
		node=t[node].to[b];
		if(t[node].val>0){
			dp[i+f+1]+=val;
			if(dp[i+f+1]>=MOD)dp[i+f+1]%=MOD;
		}
	}
	return;
}



string s[100001];
int als=0;

int main(void){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		cin >> s[i];
	}
	cin >> str;

	for(int i=0;i<n;i++){
		if(s[i].size()<=1000){
			pushTrie(s[i]);
		}else{
			kmp(str,s[i]);
			moveto[now]=s[i].size();
			now++;
		}
	}
	n=str.size();
	dp[0]=1;
	for(int i=0;i<n;i++){
		sendValue(i,dp[i]);
		for(int j=0;j<now;j++){
			int k=koko[j];
			if(k<ret[j].size() && ret[j][k]==i){
				dp[i+moveto[j]]+=dp[i];
				if(dp[i+moveto[j]]>=MOD){
					dp[i+moveto[j]]%=MOD;
				}
				koko[j]++;
			}
		}
	}
	printf("%lld\n",dp[n]);
	return 0;
}