#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <sstream>
#include <string>
#define _repargs(_1,_2,_3,name,...) name
#define _rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=(int)(a);i<(int)(b);++i)
#define rep(...) _repargs(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)
#define all(x) (x).begin(),(x).end()
#define mod 1000000007
#define inf 2000000007
#define mp make_pair
#define pb push_back
typedef long long ll;
using namespace std;
template <typename T>
inline void output(T a, int p = 0) {
    if(p) cout << fixed << setprecision(p)  << a << "\n";
    else cout << a << "\n";
}
// end of template

// Trie tree (Prefix tree)
const int leaves = 2;
const char lf = '0';

struct node{
    node *next[leaves] = {};
    int len[leaves] = {};
    bool ok = false;
    int exist = 0;
    int num = 0;
    int depth = 0;
    node() {
        rep(i, leaves) len[i] = 1;
    }
};

class Trie{
    
public:
    node *root;
    Trie(){
        root = new node();
    }
    
    void add(string &s){
        node *cur = root;
        for(char &c : s){
            if(!cur->next[c - lf]){
                cur->next[c - lf] = new node();
                cur->exist++;
                cur->next[c - lf]->depth = cur->depth + 1;
            }
            cur = cur->next[c - lf];
        }
        cur->ok = true;
        cur->num++;
    }
    
    // 縮約パート lenはその子のノードが何文字分縮約されているかを表す。numはcount(下参照)
    int build(node *n){
        if(!n) return 0;
        rep(i, leaves){
            while(n->next[i] && n->next[i]->exist == 1 && !n->next[i]->ok){
                rep(j, leaves){
                    if(n->next[i]->next[j]){
                        n->next[i] = n->next[i]->next[j];
                        n->len[i]++;
                        break;
                    }
                }
            }
            n->num += build(n->next[i]);
        }
        return n->num;
    }
    
    // ノードnの子に登録した文字列(のprefix)がいくつあるかを数える
    int count(node *n){
        return n ? n -> num : 0;
    }
    
    // 辞書順がlで定義された時のsの順番
    int ord(string &s, string &l){
        node *cur = root;
        int ret = 0;
        for(int i = 0; i < s.size();){
            char c = s[i];
            ret += cur->ok;
            rep(j, l.size()){
                if(c == l[j]){
                    i += cur->len[c - lf];
                    cur = cur->next[c - lf];
                    break;
                }
                else{
                    ret += count(cur->next[l[j] - lf]);
                }
            }
        }
        return ret;
    }
    
};

Trie t;
vector<int> D;
void dfs(node *n) {
    if(n->exist == 1){
        D.pb(n->depth);
    }
    rep(i, 2){
        if(n->next[i] != nullptr){
            dfs(n->next[i]);
        }
    }
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    // source code
    ll N;
    ll L;
    cin >> N >> L;
    vector<string> A(N);
    rep(i, N) cin >> A[i];
    
    
    rep(i, N) t.add(A[i]);
    dfs(t.root);
    vector<int> G(100);
    rep(i, D.size()){
        ll H = L - D[i];
        int g = 0;
        while(H % 2 == 0){
            H /= 2;
            g++;
        }
        G[g]++;
    }
    bool alice = false;
    rep(i, 100){
        if(G[i] % 2 == 1) alice = true;
    }
    if(alice){
        output("Alice");
    }
    else {
        output("Bob");
    }
    
    
    
    return 0;
}


Measured memory_bytes: 6344