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

int N, M;
vector<string> elms;
string text;
vector<vector<int>> cors;
bool memo[5010][1<<12];

bool dfs(int si, int s, int l){
    if(s == (1<<N)-1) return true;
    if(memo[si][s]) return false;
    
    for(int i=0; i<N; i++) if((s>>i&1) == 0){
        if(binary_search(cors[i].begin(), cors[i].end(), si))
            if(dfs(si+(int)elms[i].size(), s|(1<<i), l+(int)elms[i].size()))
                return true;
    }
    memo[si][s] = true;
    return false;
}

void solve(){
    cors.clear(); cors.resize(N);
    memset(memo, 0, sizeof(memo));
    for(int i=0; i<N; i++){
        string elm = elms[i];
        for(int j=0; j<text.size(); j++){
            if(text.substr(j, elm.size()) == elm)
                cors[i].push_back(j);
        }
    }
    int ans = 0;
    for(int i=0; i<text.size(); i++){
        ans += dfs(i, 0, 0);
    }
    cout << ans << endl;
}

int main(){
    while(cin>>N>>M, N|M){
        elms.resize(N);
        for(auto &s: elms) cin >> s;
        text = "";
        for(int i=0; i<M; i++){
            string t; cin >> t;
            text += t;
        }
        solve();
    }
    
    return 0;
}