k = int(eval(input()))

l = set()





def construct(lunnum: str, depth: int, flag: bool):

    global l

    if depth == 0:

        l.add(int(lunnum))

        return

    m = int(lunnum[-1])

    for i in list(range(0, 10)) if flag else set([max(0, m - 1), m, min(9, m + 1)]):

        construct(lunnum + str(i), depth - 1, (i == 0) & flag)





construct("0", 10, True)

ls = sorted(list(l))

print((ls[k]))

k = int(eval(input()))

l = set()



# lunnum : 構築中のルンルン数

#  depth : 桁数

#   flag : 上位桁が全て0かどうかのフラグ

def construct(lunnum: str, depth: int, flag: bool):

    global l

    if depth == 0:

        l.add(int(lunnum))

        return

    # m = 末尾桁の値

    m = int(lunnum[-1])

    if flag:

        # 上位桁に0以外の数字が無いなら

        for i in range(0, 10):

            construct(lunnum + str(i), depth - 1, i == 0)

    else:

        # m=[1,8] は [m-1,m,m+1], m=0 は [0,1], m=9 は [8,9] を末尾にくっつけて再帰

        for i in set([max(0, m - 1), m, min(9, m + 1)]):

            construct(lunnum + str(i), depth - 1, False)





# サンプルケース(input=100000 output=3234566667)より、答えは10桁以下であるのでdepth=10としてDFS

construct("0", 10, True)

ls = sorted(list(l))

print((ls[k]))

k = int(eval(input()))
l = set()


def construct(lunnum: str, depth: int, flag: bool):
    global l
    if depth == 0:
        l.add(int(lunnum))
        return
    m = int(lunnum[-1])
    for i in list(range(0, 10)) if flag else set([max(0, m - 1), m, min(9, m + 1)]):
        construct(lunnum + str(i), depth - 1, (i == 0) & flag)


construct("0", 10, True)
ls = sorted(list(l))
print((ls[k]))

k = int(eval(input()))
l = set()
# lunnum : 構築中のルンルン数
#  depth : 桁数
#   flag : 上位桁が全て0かどうかのフラグ
def construct(lunnum: str, depth: int, flag: bool):
    global l
    if depth == 0:
        l.add(int(lunnum))
        return
    # m = 末尾桁の値
    m = int(lunnum[-1])
    if flag:
        # 上位桁に0以外の数字が無いなら
        for i in range(0, 10):
            construct(lunnum + str(i), depth - 1, i == 0)
    else:
        # m=[1,8] は [m-1,m,m+1], m=0 は [0,1], m=9 は [8,9] を末尾にくっつけて再帰
        for i in set([max(0, m - 1), m, min(9, m + 1)]):
            construct(lunnum + str(i), depth - 1, False)


# サンプルケース(input=100000 output=3234566667)より、答えは10桁以下であるのでdepth=10としてDFS
construct("0", 10, True)
ls = sorted(list(l))
print((ls[k]))

- - +# lunnum : 構築中のルンルン数 +#  depth : 桁数 +#   flag : 上位桁が全て0かどうかのフラグ +    # m = 末尾桁の値 -    for i in list(range(0, 10)) if flag else set([max(0, m - 1), m, min(9, m + 1)]): -        construct(lunnum + str(i), depth - 1, (i == 0) & flag) +    if flag: +        # 上位桁に0以外の数字が無いなら +        for i in range(0, 10): +            construct(lunnum + str(i), depth - 1, i == 0) +    else: +        # m=[1,8] は [m-1,m,m+1], m=0 は [0,1], m=9 は [8,9] を末尾にくっつけて再帰 +        for i in set([max(0, m - 1), m, min(9, m + 1)]): +            construct(lunnum + str(i), depth - 1, False) +# サンプルケース(input=100000 output=3234566667)より、答えは10桁以下であるのでdepth=10としてDFS