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

void _print() { cerr << "]" << endl; }
template<typename T, typename... V>
void _print(T t, V... v) { cerr << t; if (sizeof...(v)) cerr << ", "; _print(v...); }

//#define LOCAL
#ifdef LOCAL
  #define dbg(x...) cerr << "[" << #x << "]: ["; _print(x)
#else
  #define dbg(x...)
  #define endl '\n'
#endif

#define pb push_back
#define ff first
#define ss second
#define sz(x) int(x.size())
#define all(x) x.begin(), x.end()
#define forn(i, n) for (int i = 0; i < n; ++i)
#define forne(i, n) for (int i = 0; i <= n; ++i)
#define rforn(i, n) for (int i = n-1; i >= 0; --i)
#define forab(i, a, b) for (int i = a; i < b; ++i)
#define forabe(i, a, b) for (int i = a; i <= b; ++i)
#define form(i, n, m, x) for (int i = n; i < m; i += x)
#define rform(i, n, m, x) for (int i = n; i >= m; i -= x)

typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;

const ll mod = 1000000007;
const ll p = 257;
ll power[100002];

void pre(){
    power[0] = 1;
    forab(i, 1, 100002){
        power[i] = (power[i-1] * p) % mod;
    }
}

ll get_hash(string &s){
    ll h = 0;
    forn(i, sz(s)){
        h = (h + (s[i] * power[i])) % mod;
    }
    return h;
}

vector<string> words;
vector<ll> hwords;

string s;

struct node{
    int len;
    ll h;

    node(){}
    node(int _l, ll _h){
        len = _l;  h = _h;
    }
};

struct STree {
    int n; vector<node> st;
    node neutro = node(0, 0);

    STree(){}

    void build(string &a) {
        n = sz(a);
        st.resize(n * 4);
        build(1, 0, n - 1, a);
    }

    node oper(node a, node b) {
        node n = node(a.len + b.len, (a.h+b.h*power[a.len]) % mod);
        return n;
    }

    void build(int v, int tl, int tr, string &a) {
        if(tl == tr) {
            st[v] = node(1, a[tl]);
            return;
        }
        int tm = (tr + tl) / 2;
        build(v * 2, tl, tm, a);
        build(v * 2 + 1, tm + 1, tr, a);
        st[v] = oper(st[v * 2], st[v * 2 + 1]);
    }

    node query(int v, int tl, int tr, int l, int r) {
        if(tl > r || tr < l) return neutro;
        if(l <= tl && tr <= r) return st[v];
        int tm = (tl + tr) / 2;
        return oper(query(v * 2, tl, tm, l, r), query(v * 2 + 1, tm + 1, tr, l, r));
    }

    ll query(int l, int r) { return query(1, 0, n - 1, l, r).h; }
};

int n;
int memo[100002];
STree st;

int dp(int i){
    if(i >= sz(s)) return 1;
    if(memo[i] != -1) return memo[i];
    //dbg(i);

    int ans = 0;
    forn(k, n){
        //ll h = st.query(i, i+sz(words[k])-1);
        //dbg("#", hwords[k], h, i, i+sz(words[k])-1);
        if(hwords[k] == st.query(i, i+sz(words[k])-1)){
            ans = (ans + dp(i + sz(words[k]))) % mod;
        }
    }
    return memo[i] = ans;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    pre();

    while(cin >> n){
        words.clear();
        hwords.clear();

        string x;
        forn(i, n){
            cin >> x;
            words.pb(x);
            hwords.pb(get_hash(x));
        }

        cin >> s;
        st.build(s);

        memset(memo, -1, sizeof memo);
        int res = dp(0);
        cout << res << '\n';
    }

    return 0;
}


