#include<bits/stdc++.h>
#define int long long
using namespace std;

class RollingHash{
public:
  typedef long long ll;
  ll B, mod;  //B: ハッシュ基数
  int n;
  string s;
  vector<ll> hash;
  vector<ll> k;

  RollingHash():n(-1){};
  RollingHash(string s,ll B = 1777771,ll mod = 1e9 + 7):
    B(B),mod(mod),n(s.size()),s(s),hash(n+1),k(n+1)
  {
    for(int i=0;i<n;i++) hash[i+1] = (hash[i] * B % mod + s[i]) % mod;
    k[0] = 1;
    for(int i=1;i<=n;i++) k[i] = (k[i-1] * B) % mod;
  }

  ll get(int l,int r){ //[l, r)
    assert(0<=l && r<=n && l<=r);
    return (mod + hash[r] - hash[l] * k[r-l] % mod) % mod;
  }
  
  //hash[a]とB.hash[b]からみて何文字一致してるか。
  int count(int a, RollingHash &B, int b){
    int L = 0, R = min( n - a, B.n - b ) + 1;
    while( L + 1 < R ){
      int M = ( L + R ) / 2;
      get( a, a + M ) != B.get( b, b + M ) ? R = M : L = M;
    }
    return L;
  }
};

signed main(){
  int n,mod=1e9+7;
  string s,t;
  cin>>n;
  map<int,vector<int> > mp;
  vector<int> v[1000],o;
  for(int i=0;i<n;i++){
    cin>>s;
    RollingHash tp=RollingHash(s);
    mp[s.size()].push_back(tp.get(0,0+s.size()));    
  }
  
  int m=0;
  for(auto p : mp){
    o.push_back(p.first);
    for(auto pp : p.second)v[m].push_back(pp);
    sort(v[m].begin(),v[m].end());
    m++;
  }
  cin>>t;
  RollingHash rh=RollingHash(t);
  int dp[100001]={};
  dp[0]=1;
  
  for(int i=0;i<t.size();i++){
    for(int j=0;j<m;j++){
      if(i+o[j]>t.size())break;
      int hs=rh.get(i,i+o[j]);
      auto I=lower_bound(v[j].begin(),v[j].end(),hs);
      if(I==v[j].end()||*I!=hs)continue;
      (dp[i+o[j]]+=dp[i])%=mod;
    }
  }
  cout<<dp[t.size()]<<endl;
  return 0;
}

