Problem: 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`.

Examples

Input

2 2
00
01


Output

Alice


Input

2 2
00
11


Output

Bob


Input

3 3
0
10
110


Output

Alice


Input

2 1
0
1


Output

Bob


Input

1 2
11


Output

Alice


Input

2 3
101
11


Output

Bob

Solution (in JAVA):

Solution:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

class Main{

    static long L;

    static long grundy(long v){
        for(long i=0;i<60;++i)if(((v>>i)&1)==1)return (1L<<i);
        return 0;
    }

    // どの高さの木を新しく踏んだか？
    // 一番最初に未踏の地を踏んだとこの木を消す
    // そこから一番最後一個手前までの木を追加する

    static class Node{
        Node next[] = new Node[2];
        long depth = 0;
        Node(long d){
            depth=d;
        }
        void add(int i){
            next[i]=new Node(depth + 1);
        }
    }

    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        L  = scan.nextLong();
        Node root = new Node(-1);
        Map<Long, Integer> trees = new HashMap<>();
        trees.put(L, 2);
        for(int i=0;i<N;++i){
            String s = scan.next();
            Node r = root;
            long first=-1;
            for(int j=0;j<s.length();++j){
                int n = s.charAt(j)-'0';
                if(r.next[n]==null){
                    r.add(n);
                    r=r.next[n];
                    if(first<0){
                        first=L-r.depth;
                        trees.put(L-r.depth, trees.get(L-r.depth)-1);
                    }
                    else{
                        if(!trees.containsKey(L-r.depth))trees.put(L-r.depth, 0);
                        trees.put(L-r.depth, trees.get(L-r.depth)+1); // getだけで出来る？
                    }
                }else{
                    r=r.next[n];
                }
            }
        }
        long grn = 0;
        for(Map.Entry<Long,Integer> entry : trees.entrySet()){
            if((long)entry.getValue()%2==1)grn^=grundy((long)entry.getKey());
        }
        System.out.println(grn==0 ? "Bob":"Alice");
        
    }
}