#include <stdio.h>
#include <vector>
using namespace std;
int main(void){
int n,m,i,j,t,tmp,min=1,lp;
scanf("%d%d",&n,&m);
vector<vector<int> > podzial;
vector<int> komorka;
vector<int> kom_temp;
vector<int> p;
bool sprawdzonapara[n][n];
int wz[m];
podzial.resize(n);
komorka.resize(1);
komorka[0]=1;
p.resize(m+2);
p[0]=0;
for(i=0;i<n;i++) {
scanf("%d",&tmp);
podzial[i].resize(tmp);
for(j=0;j<podzial[i].size();j++) scanf("%d",&podzial[i][j]);
}
for(i=0;i<m;i++) scanf("%d",&wz[i]);
bool odblokowany=true;
while(odblokowany){
odblokowany=false;
for(i=1,t=0;i<p.size();i++){
if(i<m){
while(t>0&&wz[t]!=wz[i]) t=p[t-1];
if(wz[t]==wz[i])p[i]=++t;
else p[i]=0;
}
else if (i==m) p[i]=0;
else{
while(t>0&&wz[t]!=komorka[i-m-1])t=p[t-1];
if(wz[t]==komorka[i-m-1])p[i]=++t;
else p[i]=0;
//printf("tu(%d)",komorka[i-m-1]);
if(i>m+1&&!sprawdzonapara[komorka[i-m-1]][komorka[i-m-2]]){
sprawdzonapara[komorka[i-m-1]][komorka[i-2-m]]=true;
odblokowany=true;
}
if(min==1) odblokowany=true;
if(p[i]==m){ printf("%d",min); return 0;}
}
//printf("%d ",i);
}
for(i=0;i<komorka.size();i++){
kom_temp.insert(kom_temp.end(),podzial[komorka[i]-1].begin(),podzial[komorka[i]-1].end());
}
komorka.clear();
komorka=kom_temp;
kom_temp.clear();
p.resize(m+1+komorka.size());
min++;
//for(i=0;i<komorka.size();i++) printf("%d ",komorka[i]);
//printf("\n");
}
printf("-1");
return 0;
}