#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <map>

using namespace std;

#define N 10010
typedef long long ll;
ll p[N],q[N];
class RollingHash2{
private:
  ll aa[N];
  ll bb[N];
  ll P,Q;
public:
  RollingHash2(){}
  RollingHash2(string &s,ll _P,ll _Q){
    int n=s.size();
    aa[0]=bb[0]=0;
    P=_P;
    Q=_Q;
    // hash値を計算
    for(int i=1;i<=n;i++)aa[i]=aa[i-1]*P+s[i-1];
    for(int i=1;i<=n;i++)bb[i]=bb[i-1]*Q+s[i-1];
  }
  pair<ll,ll> getHash(int x,int y){
    return make_pair(aa[y+1]-aa[x]*p[y-x+1],
		     bb[y+1]-bb[x]*q[y-x+1]);
  }
};
RollingHash2 fHash;

// 格文字列のハッシュ値
pair<ll,ll> hashVal[12];
ll dp[1<<12][12];
string strs[12];
string fullTxt;
int n,m;
ll dfs(int pos,int mask,int cur){
  if(dp[mask][cur]>=0)return dp[mask][cur];
  else if(mask==(1<<n)-1)return 1;
  ll res=0;
  for(int i=0;i<n;i++){
    if((mask>>i)&1)continue;
    // ハッシュ値が一致する場合
    if(fHash.getHash(pos,pos+strs[i].size()-1)
       ==hashVal[i]){
      res+=dfs(pos+strs[i].size(),mask|(1<<i),i);
    }
  }
  return dp[mask][cur]=res;
}

ll fact[20];
int main(){
  const ll P=1000000007;
  const ll Q=4300003200017LL;
  fact[0]=1;
  for(int i=1;i<20;i++)fact[i]=fact[i-1]*i;
  // P**iを計算
  p[0]=1;
  for(int i=1;i<=10000;i++)p[i]=p[i-1]*P;
  q[0]=1;
  for(int i=1;i<=10000;i++)q[i]=q[i-1]*Q;
  while(cin>>n>>m&&(n|m)){
    fullTxt="";
    int sz=0;
    map<string,int> scnt;
    for(int i=0;i<n;i++){
      cin>>strs[i];
      scnt[strs[i]]++;
      sz+=strs[i].size();
      // ハッシュ値を計算しておく
      RollingHash2 rh(strs[i],P,Q);
      hashVal[i]=rh.getHash(0,strs[i].size()-1);
    }
    ll divNum=1;
    for(map<string,int>::iterator it=scnt.begin();
	it!=scnt.end();it++){
      divNum*=fact[it->second];
    }
    for(int i=0;i<m;i++){
      string tmp;cin>>tmp;
      fullTxt+=tmp;
    }
    // 計算済みの結果を登録しておく
    map<pair<ll,ll>,ll> mem;
    fHash=RollingHash2(fullTxt,P,Q);
    ll res=0;
    for(int i=0;i+sz<=fullTxt.size();i++){
      pair<ll,ll> hv=fHash.getHash(i,i+sz-1);
      // 計算済みであれば
      if(mem.find(hv)!=mem.end())res+=mem[hv];
      // まだ計算済みでない
      else{
	memset(dp,-1,sizeof(dp));
	ll tmp=0;
	for(int j=0;j<n;j++){
	  if(fHash.getHash(i,i+strs[j].size()-1)
	     ==hashVal[j])
	    tmp+=dfs(i+strs[j].size(),1<<j,j);
	  if(tmp>0){
	    tmp=1;
	    break;
	  }
	}
	mem[hv]=tmp;
	res+=tmp;
      }
    }
    cout<<res<<endl;
  }
  return 0;
}