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<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<queue>
using namespace std;

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

#define pb push_back
#define fr first
#define sc second
#define mp1(a,b,c) P1(a,P(b,c))

ll L;

struct SEG{
	bool flag;
	bool ch;
	SEG *chl,*chr;
	void init(bool flag_ = false){
		flag = flag_;
		ch = false;
	}
	void mkch(){
		chl = new SEG;
		chl->init();
		chr = new SEG;
		chr->init();
		ch = true;
	}
	void add(string *s,int d){
		if(s->size() == d){
			flag = false;
			return;
		}
		if(!ch)mkch();
		if(flag){
			flag = false;
			chl->flag = true;
			chr->flag = true;
		}
		if((*s)[d] == '0')chl->add(s,d+1);
		else chr->add(s,d+1);
	}
	ll sum(ll d){
		if(flag)return (L+1-d)&(-L-1+d);
		if(!ch)return 0;
		return chl->sum(d+1)^chr->sum(d+1);
	}
};

int main(){
	static int N;
	static string s[100010];
	cin >> N >> L;
	for(int i = 1 ; i <= N ; i ++){
		cin >> s[i];
	}
	
	SEG seg;
	seg.init(true);
	for(int i = 1 ; i <= N ; i ++){
		seg.add(&(s[i]),0);
	}
	if(seg.sum(0) == 0)puts("Bob");
	else puts("Alice");
}