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>
using namespace std;
#define int long long

int g(int a){
  int t=1;
  while(t<a)t<<=1;
  while(true){
    while(t>a)t>>=1;
    if(t==a)return t;
    a-=t;
  }
  return -1;
}
int ans;
map<int,int> m;
void f(int l,int r){
  int wi=r-l;
  if(wi<=10){
    for(int i=l;i<r;i++)ans^=g(i);
    return;
  }
  int t=1;
  while(t<wi)t<<=1;
  t>>=1;t>>=1;
  for(int i=l;i<r;i++){
    if(i%t==1&&i+t+t-2<r){
      ans^=t;
      return f(i+t+t-1,r);
    }
    else ans^=g(i);
  }
}

signed main(){
  int n,l;cin>>n>>l;
  vector<string> s(n);
  for(int i=0;i<n;i++)cin>>s[i];
  sort(s.begin(),s.end());
  for(int i=0;i<n;i++){
    int a=0;
    if(i)while(s[i-1][a]==s[i][a])a++;
    int sl=s[i].size()-a;
    int ll=l-a;
    m[ll+1]^=1;
    m[ll-sl+1]^=1;
  }
  vector<int> v;
  for(auto p:m)if(p.second)v.push_back(p.first);
  for(int i=0;i<v.size();i+=2)f(v[i],v[i+1]);
  cout<<(ans?"Alice":"Bob")<<endl;
}