#include <bits/stdc++.h>
#define loop(n) for (int ngtkana_is_genius = 0; ngtkana_is_genius < int(n); ngtkana_is_genius++)
#define rep(i, begin, end) for(int i = int(begin); i < int(end); i++)
#define all(v) v.begin(), v.end()
#define rand(l, r) std::uniform_int_distribution<>(l, r)(mt)
#define lint long long
auto cmn = [](auto& a, auto b){if (a > b) {a = b; return true;} return false;};
auto cmx = [](auto& a, auto b){if (a < b) {a = b; return true;} return false;};
void debug_impl() { std::cerr << std::endl; }
template <typename Head, typename... Tail>
void debug_impl(Head head, Tail... tail){
  std::cerr << " " << head;
  debug_impl(tail...);
}
#ifndef STOPIT
#define debug(...)\
  std::cerr << std::boolalpha << "[" << #__VA_ARGS__ << "]:";\
  debug_impl(__VA_ARGS__);\
  std::cerr << std::noboolalpha;
#else
#define debug 0;
#endif

template < typename Container, typename Value = typename Container::value_type, std::enable_if_t<!std::is_same< Container, std::string >::value, std::nullptr_t> = nullptr>
std::istream& operator>> (std::istream& is, Container& v)
  { for (auto & x : v) { is >> x; } return is; }

template < typename Container, typename Value = typename Container::value_type, std::enable_if_t<!std::is_same< Container, std::string >::value, std::nullptr_t> = nullptr >
std::ostream& operator<< (std::ostream& os, Container const& v) {
 os << "{";
  for (auto it = v.begin(); it != v.end(); it++)
    {os << (it != v.begin() ? "," : "") << *it;}
  return os << "}";
}

class trie_node {
    int                 d;   // Root -> 0, One letter -> 1
    std::vector< int >  ids;
    std::vector< int >  nexts;

  public:
    trie_node(int n, int d): d(d), ids(), nexts(n, -1) {}

    auto get_ids()   const { return ids;   }
    auto get_nexts() const { return nexts; }
    auto depth()     const { return d;     }

    decltype(auto) emplace_back(int x) { return ids.emplace_back(x); }
    decltype(auto) at          (int i) { return nexts.at(i);   }
};

std::ostream& operator<< (std::ostream& os, trie_node const& v) {
  auto const & a = v.get_ids();
  auto const & b = v.get_nexts();
  os << "({";
  for (auto it = a.begin(); it != a.end(); it++)
    { os << (it == a.begin() ? "" : " " ) << *it; }
  os << "},{";
  for (auto it = b.begin(); it != b.end(); it++)
    { os << (it == b.begin() ? "" : " " ) << *it; }
  return os << "})";
}

template < typename Fn >
class trie {
  int                 n;       // The number of the kinds of chars
  int                 cnt;     // The number of the strings
  std::vector< trie_node > storage; // The seq of nodes
  Fn                  encoder; // char -> int

public:
  trie()=default;
  trie(int n, const Fn& encoder):
    n(n),
    cnt(0),
    storage(1, trie_node(n, 0)),
    encoder(encoder)
    {}

  auto get() const { return storage; }

  // Automatically issue a string id.
  void insert(const std::string& s) {
    std::vector< int > seq(s.length());
    std::transform(s.begin(), s.end(), seq.begin(), encoder);
    auto pos = 0, d = 0;
    for (auto x : seq) {
      d++;
      auto& now      = storage.at(pos);
      auto& next_pos = now.at(x);
      if (next_pos == -1) {
        next_pos = storage.size();
        storage.emplace_back(n, d);
      }
      pos = next_pos;
    }
    storage.at(pos).emplace_back(cnt++);
  }

  // Return the string ids.
  auto find(const std::string& s) {
    std::vector<int> seq(s.length());
    std::transform(s.begin(), s.end(), seq.begin(), encoder);
    auto vid = 0;
    for (auto x : seq) {
      vid = storage.at(vid).at(x);
      if (vid == -1) return std::vector< int >{};
    }
    return storage.at(vid).get_ids();
  }

  auto count(const std::string& s)
    { return find(s).size(); }

  // Return the pairs of length & id
  auto find_prefices(const std::string& s) {
    int  n   = s.length();
    auto ret = std::vector< std::pair< int, int > >{};
    auto vid = 0;
    for (int i = 0; i < n; i++) {
      vid = storage.at(vid).at(encoder(s.at(i)));
      if (vid == -1) return ret;
      for (auto id : storage.at(vid).get_ids())
        { ret.emplace_back(i + 1, id); }
    }
    return ret;
  }
};

template < typename Fn >
auto make_trie(int n, const Fn& encoder)
  { return trie< Fn >(n, encoder); }

int main() {
  std::cin.tie(0); std::cin.sync_with_stdio(false);
  int n; lint m; std::cin >> n >> m;
  auto trie = make_trie(2, [](auto c){ return c - '0'; });
  loop(n) {
    std::string s; std::cin >> s;
    trie.insert(s);
  }
  auto const seq = trie.get();
  std::vector< lint > leaves;
  for (auto x : seq) {
    auto const ht = m - x.depth();
    if (ht == 0) continue;
    auto const & v = x.get_nexts();
    if (std::count(all(v), -1) == 1)
      { leaves.emplace_back(ht); }
  }
  std::transform(all(leaves), leaves.begin(),  [] (auto x)
    { return 1 << __builtin_ctzl(x); });
  auto grundy = std::accumulate(all(leaves), 0LL, [](auto x, auto y)
    { return x ^ y; });
  std::cout << (grundy == 0 ? "Bob" : "Alice") << std::endl;
  return 0;
}


Measured memory_bytes: 20752