#include<cstdio>
#include<cstring>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

void KMP_build(const char *pttn,int *fail){
	int n=strlen(pttn);
	fail[0]=-1;
	for(int i=1,j=-1;i<=n;i++){
		while(j>=0 && pttn[j]!=pttn[i-1]) j=fail[j];
		fail[i]=++j;
	}
}

void KMP_search(const char *s,const char *pttn,const int *fail,bool *res){
	int m=strlen(s),n=strlen(pttn),j=0;
	rep(i,m){
		while(j>=0 && s[i]!=pttn[j]) j=fail[j];
		j++;
		if(j==n){
			res[i-n+1]=true;
			j=fail[j];
		}
	}
}

int L; // s の長さ

int n,len[12];
bool check[12][5000]; // check[i][j] := ( s[j..j+len[i]) == key[i] )

char dp[5000][1<<12]; // メモリ節約のため char
bool dfs(int x,int S){
	if(S==(1<<n)-1) return true;
	if(x>=L) return false;

	if(dp[x][S]!=-1) return dp[x][S];

	rep(i,n) if(check[i][x] && (S>>i&1)==0 && dfs(x+len[i],S|1<<i)) return dp[x][S]=true;
	return dp[x][S]=false;
}

int main(){
	for(int m;scanf("%d%d",&n,&m),n;){
		char key[12][32];
		rep(i,n) scanf("%s",key[i]), len[i]=strlen(key[i]);

		L=0;
		char s[5001];
		rep(i,m){
			scanf("%s",s+L);
			L+=strlen(s+L);
		}

		rep(i,n){
			rep(x,L) check[i][x]=false;
			int fail[5001];
			KMP_build(key[i],fail);
			KMP_search(s,key[i],fail,check[i]);
		}

		int ans=0;
		memset(dp,-1,sizeof dp);
		rep(x,L) if(dfs(x,0)) ans++;
		printf("%d\n",ans);
	}

	return 0;
}