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 CPP):

Solution:
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;
using lint=long long;

struct trie{
	trie* l;
	trie* r;
	trie():l(nullptr),r(nullptr){}
};

void add(int i,const string& s,trie* t){
	if(i==s.length()) return;

	if(s[i]=='0'){
		if(!t->l) t->l=new trie;
		add(i+1,s,t->l);
	}
	else{
		if(!t->r) t->r=new trie;
		add(i+1,s,t->r);
	}
}

lint L;

lint grundy(int i,trie* t){
	if(i==L) return 0;

	if(!t){
		lint h=L-i,res=1;
		while(h%2==0){ h/=2; res*=2; }
		return res;
	}
	else{
		return grundy(i+1,t->l)^grundy(i+1,t->r);
	}
}

int main(){
// experiment
/*
	int g[100];
	g[1]=1;
	for(int i=2;i<70;i++){
		set<int> S{0};
		int x=0;
		for(int j=i-1;j>0;j--){
			x^=g[j];
			S.emplace(x);
		}
		for(int j=0;;j++){
			if(S.count(j)==0){
				g[i]=j;
				break;
			}
		}
	}
	rep(i,70) printf("g[%2d] = %2d\n",i,g[i]);
	return 0;
*/
	trie root;

	int n; cin>>n>>L;
	rep(i,n){
		string s; cin>>s;
		add(0,s,&root);
	}

	cout<<(grundy(0,root.l)^grundy(0,root.r)?"Alice":"Bob")<<endl;

	return 0;
}