For strings s and t, we will say that s and t are prefix-free when neither is a prefix of the other.
Let L be a positive integer. A set of strings S is a good string set when the following conditions hold true:
 - Each string in S has a length between 1 and L (inclusive) and consists of the characters 0 and 1.
 - Any two distinct strings in S are prefix-free.
We have a good string set S = \{ s_1, s_2, ..., s_N \}. Alice and Bob will play a game against each other. They will alternately perform the following operation, starting from Alice:
 - Add a new string to S. After addition, S must still be a good string set.
The first player who becomes unable to perform the operation loses the game. Determine the winner of the game when both players play optimally.

-----Constraints-----
 - 1 \leq N \leq 10^5
 - 1 \leq L \leq 10^{18}
 - s_1, s_2, ..., s_N are all distinct.
 - { s_1, s_2, ..., s_N } is a good string set.
 - |s_1| + |s_2| + ... + |s_N| \leq 10^5

-----Input-----
Input is given from Standard Input in the following format:
N L
s_1
s_2
:
s_N

-----Output-----
If Alice will win, print Alice; if Bob will win, print Bob.

-----Sample Input-----
2 2
00
01

-----Sample Output-----
Alice

If Alice adds 1, Bob will be unable to add a new string.

```python

USER_FILENAME = "<user_code>"
import sys, json, builtins
import math, heapq, bisect, itertools, functools, collections, statistics, fractions, decimal, operator, array, random, re, string, os, pathlib
try:
    import resource as _res
except Exception:
    _res = None
from collections import Counter, defaultdict, deque, OrderedDict
from functools import lru_cache, reduce
from itertools import accumulate, permutations, combinations, product
from math import gcd, ceil, floor, sqrt
from decimal import Decimal
try:
    from typing import *
except Exception:
    pass
try:
    sys.setrecursionlimit(1_000_000)
except Exception:
    pass
try:
    import site as _site
    try:
        _sys_sites = _site.getsitepackages() if hasattr(_site, "getsitepackages") else []
        for _p in _sys_sites:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
    try:
        _usp = _site.getusersitepackages()
        if isinstance(_usp, str):
            _usp = [_usp]
        for _p in _usp:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
except Exception:
    pass

ns = {"__name__": "__main__"}
for _k, _v in list(globals().items()):
    if not _k.startswith("_"):
        ns[_k] = _v
_CODE = "def main():\n    import sys\n    from collections import defaultdict\n    input = sys.stdin.readline\n\n    mod = 10**10+7\n    mod2 = 10**10+9\n    mod3 = 998244353\n    N, L = list(map(int, input().split()))\n    dic = defaultdict(int)\n    dic2 = defaultdict(int)\n    dic3 = defaultdict(int)\n    h_list = []\n    h2_list = []\n    h3_list = []\n    pair = {}\n    pair2 = {}\n    pair3 = {}\n    M = 0\n    for _ in range(N):\n        s = input().rstrip('\\n')\n        h = 0\n        h2 = 0\n        h3 = 0\n        for i in range(len(s)):\n            M += 1\n            h = (h*1007 + int(s[i]) + 1) % mod\n            pair[h] = (h + 1)%mod if s[i] == '0' else (h-1)%mod\n            h2 = (h2 * 2009 + int(s[i]) + 1) % mod2\n            pair2[h2] = (h2 + 1)%mod2 if s[i] == '0' else (h2-1)%mod2\n            h3 = (h3 * 3001 + int(s[i]) + 1) % mod3\n            pair3[h3] = (h3 + 1) % mod3 if s[i] == '0' else (h3 - 1) % mod3\n            dic[h] = i+1\n            dic2[h2] = i+1\n            dic[h3] = i+1\n            h_list.append(h)\n            h2_list.append(h2)\n            h3_list.append(h3)\n\n    g = 0\n    seen = defaultdict(int)\n    seen2 = defaultdict(int)\n    seen3 = defaultdict(int)\n    for i in range(M):\n        s, s2, s3 = h_list[i], h2_list[i], h3_list[i]\n        if seen[s] and seen2[s2] and seen3[s3]:\n            continue\n        t = pair[s]\n        t2 = pair2[s2]\n        t3 = pair3[s3]\n        if dic[t] == 0 or dic2[t2] == 0 or dic3[t3] == 0:\n            p = [dic[s], dic2[s2], dic3[s3]]\n            p.sort()\n            tmp = L - p[1] + 1\n            '''\n            if not seen[s]:\n                tmp = L - dic[s] + 1\n            elif not seen[s2]:\n                tmp = L - dic2[s2] + 1\n            else:\n                tmp = L - dic3[s3] + 1\n            '''\n            cnt = 0\n            while tmp % 2 == 0:\n                tmp //= 2\n                cnt += 1\n            g ^= (2**cnt)\n            #print(g, s, s2, t, t2, dic[t], dic2[t2])\n        seen[s] = 1\n        seen2[s2] = 1\n        seen3[s3] = 1\n\n    if g:\n        print('Alice')\n    else:\n        print('Bob')\n\n\ndef __starting_point():\n    main()\n\n__starting_point()"
_co = compile(_CODE, USER_FILENAME, "exec")
exec(_co, ns, ns)

```

Measured memory_bytes: 15999