#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 15, M = 6e5 + 15, OO = 1e6 + 3;
int n, t, ss;
char in[N], in2[N], in3[N];
int cnt[27];
list<int> adj[N];
list<int>::iterator it;
long long MOD(long long a, long long b) {
  a %= b;
  if (a < 0) a += b;
  return a;
}
int main() {
  scanf("%s", in3);
  n = strlen(in3);
  for (int i = 0; i < n; ++i) {
    in[i] = 'a' + MOD(i, 26);
  }
  printf("? %s\n", in);
  fflush(stdout);
  scanf("%s", in);
  for (int i = 0; i < n; ++i) {
    for (int j = in[i] - 'a'; j < n; j += 26) {
      adj[i].push_back(j);
    }
    if (adj[i].begin() == adj[i].end()) {
      printf("! NO\n");
      return 0;
    }
  }
  for (int i = 0; i < n; ++i) {
    in[i] = 'a' + MOD((i / 26), 26);
  }
  printf("? %s\n", in);
  fflush(stdout);
  scanf("%s", in);
  for (int i = 0; i < n; ++i) {
    for (it = adj[i].begin(); it != adj[i].end();) {
      if (in[i] != 'a' + MOD(((*it) / 26), 26))
        it = adj[i].erase(it);
      else
        ++it;
    }
  }
  for (int i = 0; i < n; ++i) {
    in[i] = '0';
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < 26; ++j) {
      cnt[j] = 0;
    }
    for (it = adj[i].begin(); it != adj[i].end(); ++it) {
      if (in[(*it)] != '0') {
        cnt[in[*it] - 'a'] = 1;
      }
    }
    for (it = adj[i].begin(); it != adj[i].end(); ++it) {
      if (in[(*it)] == '0') {
        for (int j = 0; j < 26; ++j) {
          if (!cnt[j]) {
            in[(*it)] = 'a' + j;
            cnt[j] = 1;
          }
        }
      }
    }
  }
  for (int i = 0; i < n; ++i) {
    if (in[i] == '0') in[i] = 'z';
    in2[i] = in[i];
  }
  printf("? %s\n", in);
  fflush(stdout);
  scanf("%s", in);
  for (int i = 0; i < n; ++i) {
    for (it = adj[i].begin(); it != adj[i].end();) {
      if (in2[(*it)] != in[i])
        it = adj[i].erase(it);
      else
        ++it;
    }
  }
  for (int i = 0; i < n; ++i) {
    in[(*adj[i].begin())] = in3[i];
  }
  printf("! %s\n", in);
  fflush(stdout);
}
