/* Jozef Tvarozek - Wiruses - haluz */
#include <stdio.h>

#define MAXW 50002
#define MAXN 1002
#define MAXD 12

typedef struct
{
  int a[MAXN],l;
  int next[MAXN+1];
} DATA;

char wir[MAXW+MAXW];
int npos, pos[MAXW];

DATA d[MAXD];
int e[MAXD][MAXD];
int nd,nv;
int saw[MAXD];

char bv[MAXN+MAXN+2];
int nbv;

int edge(int u,int v)
{
  int i,j;

  if ( e[u][v] == 0 )
  {
    j = 0;
    for ( i = 0; i < d[u].l; i++,j++)
      while (( j >= 0 ) && ( d[u].a[i] != d[v].a[j] ))
        j = d[v].next[j];
//    printf("(j=%d|l=%d)",j,d[v].l);
    nbv = 0;
    for (i = 0; i < d[u].l; i++)
      bv[nbv++] = d[u].a[i]+'0';
    for (i = j; i < d[v].l; i++)
      bv[nbv++] = d[v].a[i]+'0';
    bv[nbv] = 0;
//    printf("pattern: %s\n",bv);
    for (i = 0; i < nv; i++)
      if ( strstr(bv,&wir[pos[i]]) != NULL )
        break;
    if ( i < nv )
      j = 0;
    e[u][v] = d[v].l-j;
  }
  return e[u][v];
}
int visit(int vert)
{
  int i,j,val=0;
  saw[vert] = 1;
  for (i = 0; i < nd; i++)
    if ( saw[i] == 0 )
    {
      j = edge(vert,i)+visit(i);
      if ( val == 0 || val > j )
        val = j;
    }
  saw[vert] = 0;
  return val;
}

int main(void)
{
  FILE *fin,*fout;
  int i,j,k,best=9999999;
  char buf[MAXN+1];

  fin = fopen("vir.in","rt");
  fout = fopen("vir.out","wt");
//  printf("---------\n");

  fscanf(fin,"%d %d",&nd,&nv);
  for (i = 0; i < nd; i++)
  {
    fscanf(fin,"%s",buf);
    for (j = strlen(buf), k = 0; k < j; k++)
      d[i].a[k] = buf[k]-'0';
    d[i].l = j;
    d[i].next[0] = -1; j = 0;
    for ( k = 1; k < d[i].l; d[i].next[k++]=j++)
      while (( j >= 0 ) && ( d[i].a[k] != d[i].a[j] ))
        j = d[i].next[j];
    for ( k = 1; k < d[i].l; k++) if (d[i].next[k] == -1 ) d[i].next[k] = 0;
/*    for (k = 0; k < d[i].l; k++)
      printf("%d",d[i].a[k]);
    printf("\n");
    for (k = 0; k < d[i].l; k++)
      if ( d[i].next[k] < 0 )
        printf("*");
      else
        printf("%d",d[i].next[k]);
    printf("\n");
    getchar();
*/  }
    for (i = 0; i < nv; i++)
    {
      fscanf(fin,"%s",buf);
      pos[i] = npos;
      for (j = strlen(buf), k = 0; k < j; k++)
        wir[npos++] = buf[k];
      wir[npos++] = 0;
    }
//    for (i = 0; i < nv; i++)
//      printf("wirus %d: %s\n",i+1,&wir[pos[i]]);

/*  for (i = 0; i < nd; i++)
    for (j = 0; j < nd; j++)
      if ( i != j )
      {
        for (k = 0; k < d[i].l; k++)
          printf("%d",d[i].a[k]);
        printf("+");
        for (k = 0; k < d[j].l; k++)
          printf("%d",d[j].a[k]);
        printf(":%d\n",edge(i,j));
      }
*/
  for (i = 0; i < nd; i++)
  {
    j = d[i].l+visit(i);
    if ( best > j )
      best = j;
  }
  fprintf(fout,"%d\n",best);
//  printf("%d\n",best);
  return 0;
}
