#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;

#define each(i,a) for (auto&& i : a)
#define FOR(i,a,b) for (ll i=(a),__last_##i=(b);i<__last_##i;i++)
#define RFOR(i,a,b) for (ll i=(b)-1,__last_##i=(a);i>=__last_##i;i--)
#define REP(i,n) FOR(i,0,n)
#define RREP(i,n) RFOR(i,0,n)
#define __GET_MACRO3(_1, _2, _3, NAME, ...) NAME
#define rep(...) __GET_MACRO3(__VA_ARGS__, FOR, REP)(__VA_ARGS__)
#define rrep(...) __GET_MACRO3(__VA_ARGS__, RFOR, RREP)(__VA_ARGS__)
#define pb push_back
#define all(a) (a).begin(),(a).end()
#define chmin(x,v) x = min(x, v)
#define chmax(x,v) x = max(x, v)

const ll linf = 1e18;
const double eps = 1e-12;
const double pi = acos(-1);

template<typename T>
istream& operator>>(istream& is, vector<T>& vec) {
    each(x,vec) is >> x;
    return is;
}
template<typename T>
ostream& operator<<(ostream& os, const vector<T>& vec) {
    rep(i,vec.size()) {
        if (i) os << " ";
        os << vec[i];
    }
    return os;
}
template<typename T>
ostream& operator<<(ostream& os, const vector< vector<T> >& vec) {
    rep(i,vec.size()) {
        if (i) os << endl;
        os << vec[i];
    }
    return os;
}
struct Node {
    Node *lch, *rch;
    ll h;
    Node() : lch(NULL), rch(NULL) {}
    Node(ll height) : lch(NULL), rch(NULL), h(height) {}
};
void add(Node* node, const string &s) {
    each(c, s) {
        if (c == '0') {
            if (node->lch == NULL) node->lch = new Node(node->h + 1);
            node = node->lch;
        }
        else {
            if (node->rch == NULL) node->rch = new Node(node->h + 1);
            node = node->rch;
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    // const ll m = 1e3+10;
    // vector<ll> gr(m);
    // gr[0] = 1;
    // rep(i, 1, m) {
    //     // if (i % 1000 == 0) cerr << i << endl;
    //     vector<ll> v;
    //     ll gg = 0;
    //     rrep(j, i) {
    //         gg ^= gr[j];
    //         v.pb(gg);
    //     }
    //     v.pb(0);
    //     sort(all(v));
    //     v.erase(unique(all(v)), v.end());
    //     ll lb = 0, ub = v.size();
    //     rep(t, 30) {
    //         ll mid = (lb + ub) / 2;
    //         if (v[mid] <= mid) {
    //             lb = mid;
    //         }
    //         else {
    //             ub = mid;
    //         }
    //     }
    //     gr[i] = lb+1;
    // }
    // each(g, gr) cout << g << " ";
    // return 0;
    ll n, L; cin >> n >> L;
    Node* root = new Node(0);
    rep(i, n) {
        string s; cin >> s;
        add(root, s);
    }
    ll g = 0;
    function<ll(ll)> grandy = [&](ll h) {
        if (h % 2 == 0) return 1LL;
        return grandy((h-1)/2) * 2;
    };
    function<void(Node*)> dfs = [&](Node* node) {
        if (node->lch == NULL && node->rch == NULL) {
            return;
        }
        else if (node->lch == NULL) {
            dfs(node->rch);
            assert(node->h < L);
            ll h = L - node->h - 1;
            g ^= grandy(h);
        }
        else if (node->rch == NULL) {
            dfs(node->lch);
            assert(node->h < L);
            ll h = L - node->h - 1;
            g ^= grandy(h);
        }
        else {
            dfs(node->lch);
            dfs(node->rch);
        }
    };
    dfs(root);
    if (g || n == 1) {
        cout << "Alice" << endl;
    }
    else {
        cout << "Bob" << endl;
    }
}


Measured memory_bytes: 11244