import sys

from collections import deque



sys.setrecursionlimit(10000)

INF = float('inf')



N, L = list(map(int, input().split()))

S = set()

for _ in range(N):

    S.add(eval(input()))





# 追加できるのが 01... だけで

# L が 4 とすると

# 01: 次はない

# 010: 011 がある

# 011: 010 がある

# 0100: 011, 0101 がある

# 0101: 011, 0100

# 0110: 010, 0111

# 0111: 010, 0110

# 候補の長さと L だけによって次の候補の長さと数が決まる

def grundy(size):

    """

    :param int size: 候補の長さ

    :return:

    """

    # gs = {0}

    # g = 0

    # for sz in range(size + 1, L + 1):

    #     g ^= grundy(sz)

    #     gs.add(g)

    #

    # i = 0

    # while i in gs:

    #     i += 1

    # return i

    i = 1

    while (L - size + 1) % i == 0:

        i *= 2

    return i // 2





# S の各要素からトライ木つくる

trie = {}

for s in S:

    t = trie

    for c in s:

        if c not in t:

            t[c] = {}

        t = t[c]



# 候補文字列の長さのリスト

ok_size_list = []

children = deque()

children.append((trie, 0))

while len(children) > 0:

    node, size = children.popleft()

    # 0 か 1 か片方しか行けなかったら、行けない方は S の prefix にならない

    # 両方行けない場合はどう追加しても S のいずれかが prefix になってしまうからダメ

    if len(node) == 1:

        ok_size_list.append(size + 1)

    for c, child in list(node.items()):

        children.append((child, size + 1))



g = 0

for size in ok_size_list:

    g ^= grundy(size)

if g != 0:

    print('Alice')

else:

    print('Bob')
import os

import sys



if os.getenv("LOCAL"):

    sys.stdin = open("_in.txt", "r")



sys.setrecursionlimit(10 ** 9)

INF = float("inf")

IINF = 10 ** 18

MOD = 10 ** 9 + 7





# MOD = 998244353

def make_trie(str_set):

    """

    :param collections.Iterable[str] str_set:

    :rtype: dict of dict

    """

    trie = {}

    for s in str_set:

        node = trie

        for c in s:

            if c not in node:

                node[c] = {}

            node = node[c]

    return trie





N, L = list(map(int, sys.stdin.buffer.readline().split()))

S = [sys.stdin.buffer.readline().decode().rstrip() for _ in range(N)]



trie = make_trie(S)





# # grundy[i]: 深さ L - i の grundy 数

# grundy = [0] * L

# grundy[0] = 1

# for i in range(1, L):

#     gs = [0]

#     for j in range(i):

#         g = 0

#         for k in range(j, i):

#             g ^= grundy[k]

#         gs.append(g)

#     g = 0

#     while g in gs:

#         g += 1

#     grundy[i] = g

# print(grundy) # lsb

# [1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 16, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 32]



# @debug

def grundy(i):

    # 深さ i の grundy 数

    # L - i の最下位ビット

    ret = 1

    while (L - i + 1) & ret == 0:

        ret <<= 1

    return ret





g = 0

stack = [(trie, 0)]

while stack:

    nodes, depth = stack.pop()

    if depth < L and len(nodes) == 1:

        g ^= grundy(depth + 1)

    for children in list(nodes.values()):

        stack.append((children, depth + 1))



if g == 0:

    print('Bob')

else:

    print('Alice')

import sys
from collections import deque

sys.setrecursionlimit(10000)
INF = float("inf")
N, L = list(map(int, input().split()))
S = set()
for _ in range(N):
    S.add(eval(input()))
# 追加できるのが 01... だけで
# L が 4 とすると
# 01: 次はない
# 010: 011 がある
# 011: 010 がある
# 0100: 011, 0101 がある
# 0101: 011, 0100
# 0110: 010, 0111
# 0111: 010, 0110
# 候補の長さと L だけによって次の候補の長さと数が決まる
def grundy(size):
    """
    :param int size: 候補の長さ
    :return:
    """
    # gs = {0}
    # g = 0
    # for sz in range(size + 1, L + 1):
    #     g ^= grundy(sz)
    #     gs.add(g)
    #
    # i = 0
    # while i in gs:
    #     i += 1
    # return i
    i = 1
    while (L - size + 1) % i == 0:
        i *= 2
    return i // 2


# S の各要素からトライ木つくる
trie = {}
for s in S:
    t = trie
    for c in s:
        if c not in t:
            t[c] = {}
        t = t[c]
# 候補文字列の長さのリスト
ok_size_list = []
children = deque()
children.append((trie, 0))
while len(children) > 0:
    node, size = children.popleft()
    # 0 か 1 か片方しか行けなかったら、行けない方は S の prefix にならない
    # 両方行けない場合はどう追加しても S のいずれかが prefix になってしまうからダメ
    if len(node) == 1:
        ok_size_list.append(size + 1)
    for c, child in list(node.items()):
        children.append((child, size + 1))
g = 0
for size in ok_size_list:
    g ^= grundy(size)
if g != 0:
    print("Alice")
else:
    print("Bob")

import os
import sys

if os.getenv("LOCAL"):
    sys.stdin = open("_in.txt", "r")
sys.setrecursionlimit(10**9)
INF = float("inf")
IINF = 10**18
MOD = 10**9 + 7
# MOD = 998244353
def make_trie(str_set):
    """
    :param collections.Iterable[str] str_set:
    :rtype: dict of dict
    """
    trie = {}
    for s in str_set:
        node = trie
        for c in s:
            if c not in node:
                node[c] = {}
            node = node[c]
    return trie


N, L = list(map(int, sys.stdin.buffer.readline().split()))
S = [sys.stdin.buffer.readline().decode().rstrip() for _ in range(N)]
trie = make_trie(S)
# # grundy[i]: 深さ L - i の grundy 数
# grundy = [0] * L
# grundy[0] = 1
# for i in range(1, L):
#     gs = [0]
#     for j in range(i):
#         g = 0
#         for k in range(j, i):
#             g ^= grundy[k]
#         gs.append(g)
#     g = 0
#     while g in gs:
#         g += 1
#     grundy[i] = g
# print(grundy) # lsb
# [1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 16, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 32]
# @debug
def grundy(i):
    # 深さ i の grundy 数
    # L - i の最下位ビット
    ret = 1
    while (L - i + 1) & ret == 0:
        ret <<= 1
    return ret


g = 0
stack = [(trie, 0)]
while stack:
    nodes, depth = stack.pop()
    if depth < L and len(nodes) == 1:
        g ^= grundy(depth + 1)
    for children in list(nodes.values()):
        stack.append((children, depth + 1))
if g == 0:
    print("Bob")
else:
    print("Alice")

+import os -from collections import deque -sys.setrecursionlimit(10000) +if os.getenv("LOCAL"): +    sys.stdin = open("_in.txt", "r") +sys.setrecursionlimit(10**9) -N, L = list(map(int, input().split())) -S = set() -for _ in range(N): -    S.add(eval(input())) -# 追加できるのが 01... だけで -# L が 4 とすると -# 01: 次はない -# 010: 011 がある -# 011: 010 がある -# 0100: 011, 0101 がある -# 0101: 011, 0100 -# 0110: 010, 0111 -# 0111: 010, 0110 -# 候補の長さと L だけによって次の候補の長さと数が決まる -def grundy(size): +IINF = 10**18 +MOD = 10**9 + 7 +# MOD = 998244353 +def make_trie(str_set): -    :param int size: 候補の長さ -    :return: +    :param collections.Iterable[str] str_set: +    :rtype: dict of dict -    # gs = {0} -    # g = 0 -    # for sz in range(size + 1, L + 1): -    #     g ^= grundy(sz) -    #     gs.add(g) -    # -    # i = 0 -    # while i in gs: -    #     i += 1 -    # return i -    i = 1 -    while (L - size + 1) % i == 0: -        i *= 2 -    return i // 2 +    trie = {} +    for s in str_set: +        node = trie +        for c in s: +            if c not in node: +                node[c] = {} +            node = node[c] +    return trie -# S の各要素からトライ木つくる -trie = {} -for s in S: -    t = trie -    for c in s: -        if c not in t: -            t[c] = {} -        t = t[c] -# 候補文字列の長さのリスト -ok_size_list = [] -children = deque() -children.append((trie, 0)) -while len(children) > 0: -    node, size = children.popleft() -    # 0 か 1 か片方しか行けなかったら、行けない方は S の prefix にならない -    # 両方行けない場合はどう追加しても S のいずれかが prefix になってしまうからダメ -    if len(node) == 1: -        ok_size_list.append(size + 1) -    for c, child in list(node.items()): -        children.append((child, size + 1)) +N, L = list(map(int, sys.stdin.buffer.readline().split())) +S = [sys.stdin.buffer.readline().decode().rstrip() for _ in range(N)] +trie = make_trie(S) +# # grundy[i]: 深さ L - i の grundy 数 +# grundy = [0] * L +# grundy[0] = 1 +# for i in range(1, L): +#     gs = [0] +#     for j in range(i): +#         g = 0 +#         for k in range(j, i): +#             g ^= grundy[k] +#         gs.append(g) +#     g = 0 +#     while g in gs: +#         g += 1 +#     grundy[i] = g +# print(grundy) # lsb +# [1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 16, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 32] +# @debug +def grundy(i): +    # 深さ i の grundy 数 +    # L - i の最下位ビット +    ret = 1 +    while (L - i + 1) & ret == 0: +        ret <<= 1 +    return ret + + -for size in ok_size_list: -    g ^= grundy(size) -if g != 0: +stack = [(trie, 0)] +while stack: +    nodes, depth = stack.pop() +    if depth < L and len(nodes) == 1: +        g ^= grundy(depth + 1) +    for children in list(nodes.values()): +        stack.append((children, depth + 1)) +if g == 0: +    print("Bob") +else: -else: -    print("Bob")