#include<bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(),x.end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define debug(v) cout<<#v<<":";for(auto x:v){cout<<x<<' ';}cout<<endl;
#define mod 1000000007
using ll=long long;
const int INF=1000000000;
const ll LINF=1001002003004005006ll;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}
template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;}
 
struct IOSetup{
    IOSetup(){
        cin.tie(0);
        ios::sync_with_stdio(0);
        cout<<fixed<<setprecision(12);
    }
} iosetup;
 
template<typename T1,typename T2>
ostream &operator<<(ostream &os,const pair<T1,T2>&p){
    os<<p.first<<" "<<p.second;
    return os;
}
 
template<typename T>
ostream &operator<<(ostream &os,const vector<T>&v){
    for(int i=0;i<(int)v.size();i++) os<<v[i]<<(i+1==(int)v.size()?"":" ");
    return os;
}

template<typename T1,typename T2>
istream &operator>>(istream &is,pair<T1,T2>&p){
    is>>p.first>>p.second;
    return is;
}

template<typename T>
istream &operator>>(istream &is,vector<T>&v){
    for(T &x:v)is>>x;
    return is;
}

// 文字種
template<int sz>
struct Trie{
    struct Node{
        int nxt[sz],ex;// 自分以下で受理する文字の数
        vector<int> accept;// このノードが受理するstring ID
        Node():ex(0){memset(nxt,-1,sizeof(nxt));}
    };
 
    using F=function<int(char)>;
    // converter
    // lower case alphabet -> auto conv=[](char c){return c-'a';};
    // return<sz
    F conv;
 
    vector<Node> nodes;
    int root;
 
    Trie(F conv):conv(conv),root(0){nodes.push_back(Node());}
 
    void update_accept(int node,int id){
        nodes[node].accept.push_back(id);
    }
    void update_child(int node,int child,int id){
        nodes[node].ex++;
    }
    void add(const string &s,int id,int s_idx=0,int node_idx=0){
        if(s_idx==(int)s.size()){
            update_accept(node_idx,id);
            return ;
        }
        int k=conv(s[s_idx]);
        if(nodes[node_idx].nxt[k]==-1){
            nodes[node_idx].nxt[k]=(int)nodes.size();
            nodes.push_back(Node());
        }
        add(s,id,s_idx+1,nodes[node_idx].nxt[k]);
        update_child(node_idx,nodes[node_idx].nxt[k],id);
    }
    void add(const string &s){
        add(s,nodes[0].ex);
    }
 
    void query(const string &s,const function<void(int)>&f,int s_idx=0,int node_idx=0){
        for(auto &idx:nodes[node_idx].accept)f(idx);
        if(s_idx==(int)s.size()) return ;
        else {
            int k=conv(s[s_idx]);
            if(nodes[node_idx].nxt[k]==-1)return;
            query(s,f,s_idx+1,nodes[node_idx].nxt[k]);
        }
    }
    bool search(const string &s){
        int node_idx=0;
        for(int i=0;i<(int)s.size();i++){
            int k=conv(s[i]);
            if(nodes[node_idx].nxt[k]==-1) return false;
            node_idx=nodes[node_idx].nxt[k];
        }
        return nodes[node_idx].accept.size()>0;
    }
    int count()const{
        return (nodes[0].ex);
    }
    int size()const{
        return ((int)nodes.size());
    }
    // 問題に応じて書く
    vector<ll> v;
    ll l;
    void dfs(int ni,int depth){
        // 0
        if(nodes[ni].nxt[0]==-1){
            if(l-depth>0) v.push_back(l-depth);
        }else{
            dfs(nodes[ni].nxt[0],depth+1);
        }
        // 1
        if(nodes[ni].nxt[1]==-1){
            if(l-depth>0) v.push_back(l-depth);
        }else{
            dfs(nodes[ni].nxt[1],depth+1);
        }
    }
};


signed main(){
    int n;ll l;cin>>n>>l;
    vector<string> ss(n);cin>>ss;

    auto converter=[](char x){return x-'0';};
    Trie<2> trie(converter);
    for(auto &s:ss)trie.add(s);
    trie.l=l;
    trie.dfs(0,0);

    vector<ll> grundy;
    for(auto &x:trie.v)grundy.push_back(__builtin_ffsll(x));

    ll xs=0;
    for(auto &x:grundy)xs^=x;
    cout<<(xs!=0?"Alice":"Bob")<<endl;
    return 0;
}


Measured memory_bytes: 22196