//拘り者いろはちゃん//
//再帰関数版
//
using System;
using System.Collections.Generic;

namespace tst
{
    class Define
    {
        public static int INFTY = 100000;
    }
    class Program
    {
        public static int N;//支払金額N円
        public static int K;//嫌いな数字K個
        public static int min = Define.INFTY;
        public static int[] X = new int[4];
        public static void Keisan(int[] Ok, int k4, int k3, int k2, int k1, int cnt)
        {
            //ばらばらの数字で送られてきたものを合体
            int x = k4 * 1000 + k3 * 100 + k2 * 10 + k1;
            if (N <= x && x < min)
            {//買えて最小値を更新できるなら
                if (Ok[0] !=0 && Keta(x))//0が使えない時に残骸が残っていたら
                {//Keisan(Ok, 0, 0, 0, z, cnt);での0の残骸は消したい
                    //最小値更新しない
                }
                else min = x;
            }
            if (cnt == 3)
            {//終了条件
                return;
            }
            for (int i = 0; i < Ok.Length; i++)
            {
                Keisan(Ok, k4, k3, k2, k1, cnt + 1);
                Keisan(Ok, Ok[i],k3,  k2, k1, cnt + 1);
                Keisan(Ok, k4, Ok[i], k2, k1, cnt + 1);
                Keisan(Ok, k4, k3, Ok[i], k1, cnt + 1);
            }
        }
        public static bool Keta(int n)
        {
            //桁出しして!=0より右に0があるとアウト8210や3030も
            bool flag=false;
            int top = 5;
            for(int i=3; i>=0; i--)
            {
                X[i] = n % 10;
                n /= 10;
                if (X[i] != 0)
                {
                    top = i;
                }
            }
            for(int i = 3; i > top; i--)
            {
                if (X[i] == 0) flag = true;
            }
            //残骸があるときtrue
            return flag;
        }

        public static void Main()
        {   //支払金額N円、嫌いな数字K個
            string[] text1 = Console.ReadLine().Split(' ');
            N = int.Parse(text1[0]);
            K = int.Parse(text1[1]);
            //嫌いな数字0～9
            string[] D = Console.ReadLine().Split(' ');
            //逆に使える数の配列
            List<string> All = new List<string>() { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
            for (int i = 0; i < K; i++)
            {
                All.Remove(D[i]);
            }
            int[] Ok = new int[10 - K];
            for (int i = 0; i < Ok.Length; i++)
            {
                Ok[i] = int.Parse(All[i]);
            }
            int cnt = 0;
            foreach (int z in Ok)
            {
                //３ケタ２ケタ１ケタの場合も考えるので先頭が0でも構わない
                //１桁目からスタートしないと出力できない数がある
                Keisan(Ok, 0, 0, 0, z, cnt);
            }
            if (min == Define.INFTY)
            {//4桁未満で答えがなかった時
                if (Ok[0] == 0)
                {
                    //一桁目が0だと５ケタにならないなので
                    Console.WriteLine(Ok[1] * 10000);
                }
                else if (1 <= Ok[0] && Ok[0] <= 9)
                {
                    Console.WriteLine(Ok[0] * 10000 + Ok[0] * 1000 + Ok[0] * 100 + Ok[0] * 10 + Ok[0]);
                }
            }
            else if (min < Define.INFTY)
            {//答えがあった時
                Console.WriteLine(min);
            }
        }

    }
}

Measured memory_bytes: 13152