// Original C++ solution (slower):
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef long double ld;

#define rep(i, n) for (ll i = 0; i < n; i++)

#define FOR(i, a, b) for (ll i = a; i < b; i++)

#define is(a, b) a == b

#define len(v) ll(v.size())



class UnionFind {

public:

	vector<int> par;//親の番号

    vector<int> rank;//木の深さ

 

	UnionFind(int n){//全ての要素に対して自身が根となるように初期化, 木の深さは0になる

		rep(i,n){

            par.push_back(i);

            rank.push_back(0);

        }

	}

 

	int find(int x) {//木の根を求める

		if(par[x]==x){

            return x;

        }else{

            return par[x]=find(par[x]);

        }

	}

 

	void unite(int x,int y){//xとyの属する集合を併合

        x=find(x);

        y=find(y);

        if(x==y) return;

        if(rank[x]<rank[y]){//木の深さが小さい方を大きい方へ繋げる

            par[x]=y;

        }else{

            par[y]=x;

            if(rank[x]==rank[y]) rank[x]++;

        }

    }



    bool same(int x,int y){//xとyが同じ集合に属するか否か

        return find(x)==find(y);

    }

};

//x以下の要素への最小index, ソートしてから使ってね

template <class T> 

int former(const vector<T> &v, T x){

  return upper_bound(v.begin(), v.end(), x) - v.begin() - 1;

}

//x以上の要素への最小index

template <class T> 

int latter(const vector<T> &v, T x){

  return lower_bound(v.begin(), v.end(), x) - v.begin();

}

//vector書き出し

template <class T>

void cout_vec(const vector<T> &vec1){

  rep(i,len(vec1)){

    cout<<vec1[i]<<' ';

  }

  cout<<'\n';

}

//nCk

template <class T>

T comb(T n,T k){

    T ans=1;

    FOR(i,n-k+1,n+1){

        ans*=i;

    }

    FOR(i,1,k+1){

        ans/=i;

    }

    return ans;

}

//a,bの最大公約数

template <class T>

T gcd(T a,T b) {

	if (b == 0) return a;

	else return gcd(b, a % b);

}

//素因数分解

template <class T>

map<T,T> prime_factor(T x){

    map<T,T> ans;

    for(T i=2;i*i<=x;i++){

        while(x%i==0){

            x/=i;

            ans[i]++;

        }

    }

    if (x!=1){

        ans[x]=1;

    }

    return ans;

}

//約数列挙

template <class T>

vector<T> divisor(T x){

    vector<T> res;

    for(T i=1;i*i<=x;i++){

        if(x%i==0){

            res.push_back(i);

            if(i!=x/i){

                res.push_back(x/i);

            }

        }

    }

    return res;

}

//素数判定

template <class T>

bool is_prime(T x){

    for(T i=2;i*i<=x;i++){

        if(x%i==0){

            return false;

        }

    }

    return x!=1;

}



const ll mod=1e9+7;



//二分累乗法

ll mult(ll n,ll m){//n^m%modを求める

    if(m==1){

        return n%mod;

    }else if(m%2==0){//オーバーフロー防止のためにn^(m/2)*n^(m/2)を考える

        ll t=mult(n,m/2);

        return (t*t)%mod;

    }else{//奇数の時はn^(m-1)*nを考える

        ll t=mult(n,m-1);

        return (t*n)%mod;

    }

}

//nCkの1e9+7における余り

template <class T>

T comb_mod(T n,T k){

    T ans=1;

    T r=min(k,n-k);

    FOR(i,n-r+1,n+1){

        ans*=(i%mod);

        ans%=mod;

    }

    FOR(i,1,r+1){

        ans*=mult(i,mod-2);

        ans%=mod;

    }

    return ans;

}



/* 階乗, 階乗の逆げんテーブル作ってから

template <class T>

T comb_mod_2(T n,T k){

    T ans=(((d[n]*d2[n-k])%mod)*d2[k])%mod;

    return ans;

}

*/



template<class T>

T factorial(T n){

    T ret=1;

    while(n>0){

        ret*=(n%mod);

        ret%=mod;

        n--;

    }

}



typedef pair<ll,ll> P;



int main(){

    cin.tie(0);

    ios::sync_with_stdio(false);

    int n,k;

    cin>>n>>k;

    vector<char> d(k);

    rep(i,k){

        cin>>d[i];

    }

    /*

    vector<int> use;//使える数字

    rep(i,10){

        if(count(begin(d),end(d),i)==0){

            use.push_back(i);

        }

    }

    */

   bool flag=false;

   FOR(i,n,1000000){

       string num=to_string(i);

       rep(j,len(num)){

           //cout<<num[j]<<'\n';

           if(count(begin(d),end(d),num[j])!=0){

               break;

           }

           if(j==len(num)-1){

               cout<<i<<endl;

               return 0;

           }

       }

   }

}

// Optimized solution to the same problem (faster):
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef long double ld;

typedef pair<ll,ll> P;

typedef pair<int,int> Pi;

#define rep(i,n) for(ll i=0;i<n;i++)

#define FOR(i,a,b) for(ll i=a;i<b;i++)

#define fi first

#define se second



template<typename T> inline bool chmax(T &a, T b){if(a<b){a=b;return true;}return false;}

template<typename T> inline bool chmin(T &a, T b){if(a>b){a=b;return true;}return false;}

template<typename T> ostream& operator<<(ostream& s,const complex<T>& d) {return s<<"("<<d.real()<<", "<<d.imag()<< ")";}

template<typename T1, typename T2> ostream& operator<<(ostream& s,const pair<T1,T2>& d) {return s<<"("<<d.first<<", "<<d.second<<")";}

template<typename T> ostream& operator<<(ostream& s, const vector<T>& d){int len=d.size();rep(i,len){s<<d[i];if(i<len-1) s<<" ";}return s;}

template<typename T> ostream& operator<<(ostream& s,const vector<vector<T>>& d){int len=d.size();rep(i,len){s<<d[i]<<endl;}return s;}

template<typename T> ostream& operator<<(ostream& s,const set<T>& v){s<<"{ ";for(auto itr=v.begin();itr!=v.end();++itr) {if (itr!=v.begin()) {s<< ", ";}s<<(*itr);}s<<" }";return s;}

template<typename T1, typename T2> ostream& operator<<(ostream& s,const map<T1,T2>& m){s<<"{"<<endl;for(auto itr=m.begin();itr!=m.end();++itr){s<<" "<<(*itr).first<<" : "<<(*itr).second<<endl;}s<<"}"<<endl;return s;}



const ll mod=1e9+7;

const ll inf=1e17;

const int INF=1e9;

const double PI=acos(-1);

const double EPS=1e-10;



int main(){

	cin.tie(0);ios::sync_with_stdio(false);

	int n,k;

	cin>>n>>k;

	vector<bool> flag(10,true);

	rep(i,k){

		int d;

		cin>>d;

		flag[d]=false;

	}

	int ans=INF;

	auto dfs=[&](auto &dfs,int d,string now)->void{

		if(d==6) return ;

		if(d){

			int m=stoi(now);

			if(m>=n){

				chmin(ans,m);

				return ;

			}

		}

		rep(i,10){

			if(flag[i]){

				char ne=i+'0';

				dfs(dfs,d+1,now+ne);

			}

		}

	};

	dfs(dfs,0,"");

	cout<<ans<<endl;

}

// Fastest known solution for this problem: