#include<bits/stdc++.h>
#define N 1500
#define LL long long
using namespace std;
struct Ac{
int ch[N][10], fail[N];
int val[N];
int tot;
void Insert(string s){
int now = 0, len = s.length();
for(int i=0;i<len;i++){
int x = s[i] - '0';
if(!ch[now][x]) ch[now][x] = ++tot;
now = ch[now][x];
} val[now] = 1;
}
void Build(){
queue<int> q;
for(int i=0;i<10;i++)
if(ch[0][i]) q.push(ch[0][i]);
while(!q.empty()){
int x = q.front(); q.pop();
for(int i=0;i<10;i++){
if(ch[x][i]){
int j = fail[x];
fail[ch[x][i]] = ch[j][i];
val[ch[x][i]] |= val[fail[ch[x][i]]];
q.push(ch[x][i]);
}
else ch[x][i] = ch[fail[x]][i];
}
}
}
}ac;
LL L,R,k; int n;
LL f[20][N][2];
int digit[20];
LL dfs(int len,int u,int flag,int limit,int zero){
if(len == 0) return flag ? 1 : 0;
if(!limit && !zero && f[len][u][flag] != -1) return f[len][u][flag];
int up = limit ? digit[len] : 9;
LL ret = 0;
for(int i = 0; i <= up; i++){
if(zero && i==0 && len > 1)
ret += dfs(len-1, 0, flag, limit && i==up, 1);
else
ret += dfs(len-1, ac.ch[u][i], flag | ac.val[ac.ch[u][i]], limit && i==up, zero && i==0);
}
if(!limit && !zero) f[len][u][flag] = ret;
return ret;
}
LL check(LL x){
memset(digit,0,sizeof(digit));
int len = 0;
while(x){
digit[++len] = x%10;
x/=10;
}
memset(f,-1,sizeof(f));
LL ans = dfs(len, 0, 0, 1, 1);
return ans;
}
int main(){
scanf("%lld%lld%lld%d",&L,&R,&k,&n);
for(int i=1;i<=n;i++){
string s; cin>>s; ac.Insert(s);
} ac.Build();
LL l = L, r = R+1;
LL kk = check(L-1);
while(l<r){
LL mid = (l+r) >> 1;
if(check(mid) - kk >= k) r = mid;
else l = mid+1;
}
if(l==R+1) printf("no such number");
else printf("%lld",l);
return 0;
}