#include<bits/stdc++.h>
using namespace std;
const int INF=1e9,mod=1e9+7;
string n,z[105];
int id,d[1205][150005][2],it;
struct node{
int ch[10],fa,v;
bool isend;
node (){
memset(ch,0,sizeof(ch));
isend=0;
v=0;
}
}tr[150005];
void insert(string s){
int p=0;
for(int i=0;i<s.length();i++){
int x=s[i]-'0';
if(tr[p].ch[x]==0)tr[p].ch[x]=++id;
p=tr[p].ch[x];
tr[p].v=x;
}
tr[p].isend=1;
}
void get_fail(){
int p=0;
tr[p].fa=p;
queue<int>q;
for(int i=0;i<10;i++){
if(tr[p].ch[i]!=0){
tr[tr[p].ch[i]].fa=p;
q.push(tr[p].ch[i]);
}else tr[p].ch[i]=p;
}
while(!q.empty()){
int u=q.front();q.pop();
for(int x=0;x<10;x++){
if(tr[u].ch[x]!=0){
tr[tr[u].ch[x]].fa=tr[tr[u].fa].ch[x];
q.push(tr[u].ch[x]);
}else tr[u].ch[x]=tr[tr[u].fa].ch[x];
}
}
}
void dp(){
d[0][0][1]=1;
for(int i=0;i<n.length();i++){
for(int k=0;k<=id;k++){
for(int x=0;x<10;x++){
if(tr[tr[k].ch[x]].isend==0){
d[i+1][tr[k].ch[x]][0]=(d[i+1][tr[k].ch[x]][0]+d[i][k][0])%mod;
}
}
}
for(int k=0;k<=id;k++){
for(int x=0;x<n[i]-'0';x++){
if(tr[tr[k].ch[x]].isend==0){
d[i+1][tr[k].ch[x]][0]=(d[i+1][tr[k].ch[x]][0]+d[i][k][1])%mod;
}
}
int x=n[i]-'0';
if(tr[tr[k].ch[x]].isend==0)d[i+1][tr[k].ch[x]][1]=(d[i+1][tr[k].ch[x]][1]+d[i][k][1])%mod;
}
}
int ans=0;
for(int i=0;i<=id;i++)
ans=(ans+d[n.length()][i][0]+d[n.length()][i][1])%mod;
cout<<sum<<" "<<ans-1<<endl;
}
int main(){
int s;
cin>>n>>s;
for(int i=1;i<=s;i++){
string x;
cin>>x;
if(x[0]=='0')z[++it]=x;
insert(x);
}
get_fail();
dp();
return 0;
}