#include <bits/stdc++.h>
#pragma GCC optimize "trapv"
using namespace std;
vector<string> split(const string& s, char c) {
  vector<string> v;
  stringstream ss(s);
  string x;
  while (getline(ss, x, c)) v.push_back(x);
  return move(v);
}
template <typename T, typename... Args>
inline string arrStr(T arr, int n) {
  stringstream s;
  s << "[";
  for (int i = 0; i < n - 1; i++) s << arr[i] << ",";
  s << arr[n - 1] << "]";
  return s.str();
}
inline void __evars_begin(int line) { cerr << "#" << line << ": "; }
template <typename T>
inline void __evars_out_var(vector<T> val) {
  cerr << arrStr(val, val.size());
}
template <typename T>
inline void __evars_out_var(T* val) {
  cerr << arrStr(val, 10);
}
template <typename T>
inline void __evars_out_var(T val) {
  cerr << val;
}
inline void __evars(vector<string>::iterator it) { cerr << endl; }
template <typename T, typename... Args>
inline void __evars(vector<string>::iterator it, T a, Args... args) {
  cerr << it->substr((*it)[0] == ' ', it->length()) << "=";
  __evars_out_var(a);
  cerr << "; ";
  __evars(++it, args...);
}
template <typename T_vector>
void output_vector(const T_vector& v, bool add_one = false, int start = -1,
                   int end = -1) {
  if (start < 0) start = 0;
  if (end < 0) end = int(v.size());
  for (int i = start; i < end; i++)
    cout << v[i] + (add_one ? 1 : 0) << (i < end - 1 ? ' ' : '\n');
}
const long long MaxN = 5e5 + 5;
long long st[4 * MaxN];
long long f(long long x, long long y) { return min(x, y); }
void build(long long a[], long long node, long long start, long long end) {
  if (start == end) {
    st[node] = a[end];
  } else {
    long long mid = (start + end) / 2;
    build(a, 2 * node + 1, start, mid);
    build(a, 2 * node + 2, mid + 1, end);
    st[node] = f(st[2 * node + 1], st[2 * node + 2]);
  }
}
void update(long long node, long long start, long long end, long long pos,
            long long val) {
  if (pos < start || pos > end)
    return;
  else if (start == end && pos == start) {
    st[node] = val;
    return;
  }
  long long mid = (start + end) / 2;
  update(2 * node + 1, start, mid, pos, val);
  update(2 * node + 2, mid + 1, end, pos, val);
  st[node] = f(st[2 * node + 1], st[2 * node + 2]);
}
long long query(long long start, long long end, long long l, long long r,
                long long node) {
  if (r < start || l > end)
    return INT_MAX;
  else if (start >= l && end <= r)
    return st[node];
  long long mid = (start + end) / 2;
  return f(query(start, mid, l, r, 2 * node + 1),
           query(mid + 1, end, l, r, 2 * node + 2));
}
long long find(long long k, long long node, long long l, long long r) {
  if (l == r) return l;
  long long mid = (l + r) / 2;
  long long t = st[node * 2 + 1];
  if (k < t) {
    return find(k, node * 2 + 1, l, mid);
  } else {
    return find(k - t, node * 2 + 2, mid + 1, r);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  clock_t clk = clock();
  int t = 1;
  for (int tc = 0; tc < t; tc++) {
    fill(st, st + 4 * MaxN, INT_MAX);
    string s;
    long long k;
    cin >> s >> k;
    long long a[(long long)s.size()];
    for (int i = 0; i < (long long)s.size(); i++) {
      a[i] = (int)(s[i] - 'a' + 1);
    }
    long long n = (long long)s.size();
    build(a, 0, 0, n - 1);
    cout << "Mike" << endl;
    for (int i = 1; i < n; i++) {
      long long qry = query(0, n - 1, 0, i - 1, 0);
      if (qry < a[i]) {
        cout << "Ann" << endl;
      } else {
        cout << "Mike" << endl;
      }
    }
  }
  cerr << '\n'
       << "Time (in s): " << double(clock() - clk) * 1.0 / CLOCKS_PER_SEC
       << '\n';
}
