#include<iostream>
#include<map>
#include<cstring>
using namespace std;
const int N=510;
map<string,bool> mp[N];
int dp[N][N];
int main(){
string t,s;
int n,a;
cin>>t>>n;
for(int i=1;i<=n;i++){
cin>>a;
for(int j=1;j<=a;j++){
cin>>s;
mp[i][s]=1;
}
}
memset(dp,0x3f,sizeof dp);
dp[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=t.size();j++){
dp[i][j]=min(dp[i][j],dp[i-1][j]);
for(int k=0;k<=j;k++){
if(mp[i][t.substr(k,j-k)])dp[i][j]=min(dp[i][j],dp[i-1][k]+1);
}
}
}
if(dp[n][t.size()]<=n) cout<<dp[n][(int)t.size()];
else cout<<"-1";
return 0;
}
#include<iostream>
using namespace std;
int ans[110],b[110];
int main(){
string t,s;
int n,a;
cin>>t>>n;
for(int i=1;i<110;i++) ans[i]=1010;
for(int i=0;i<n;i++){
cin>>a;
for(int j=0;j<110;j++) b[j]=1010;
for(int j=0;j<a;j++){
cin>>s;
for(int k=0;k<t.size();k++){
if(ans[k]!=1010){
int tt=k;
bool flag=1;
for(int x=0;x<s.size();x++){
if(tt>=t.size()||t[tt]!=s[x]){
flag=0;
break;
}
tt++;
}
if(flag){
int r=k+s.size();
b[r]=min(b[r],ans[k]+1);
}
}
}
}
for(int j=0;j<110;j++) ans[j]=min(ans[j],b[j]);
}
if(ans[t.size()]==1010) cout<<"-1"<<endl;
else cout<<ans[t.size()]<<endl;
return 0;
}