#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int maxn = 1e4;
const int INF = 0x7fffffff;
const int mod = 1e9 + 7;
const double eps = 1e-7;
inline int read_int() {
  char c;
  int ret = 0, sgn = 1;
  do {
    c = getchar();
  } while ((c < '0' || c > '9') && c != '-');
  if (c == '-')
    sgn = -1;
  else
    ret = c - '0';
  while ((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + (c - '0');
  return sgn * ret;
}
inline long long read_ll() {
  char c;
  long long ret = 0, sgn = 1;
  do {
    c = getchar();
  } while ((c < '0' || c > '9') && c != '-');
  if (c == '-')
    sgn = -1;
  else
    ret = c - '0';
  while ((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + (c - '0');
  return sgn * ret;
}
char s[maxn + 5], q[maxn + 5], ans[maxn + 5], res[maxn + 5];
int pos[maxn + 5], len;
void Query() {
  printf("? %s\n", q);
  fflush(stdout);
  scanf("%s", ans);
}
int main() {
  scanf("%s", s);
  len = strlen(s);
  for (int i = 0; i < len; ++i) q[i] = i / 26 / 26 + 'a';
  Query();
  for (int i = 0; i < len; ++i) pos[i] += (ans[i] - 'a') * 26 * 26;
  for (int i = 0; i < len; ++i) q[i] = i % (26 * 26) / 26 + 'a';
  Query();
  for (int i = 0; i < len; ++i) pos[i] += (ans[i] - 'a') * 26;
  for (int i = 0; i < len; ++i) q[i] = i % 26 + 'a';
  Query();
  for (int i = 0; i < len; ++i) pos[i] += (ans[i] - 'a');
  for (int i = 0; i < len; ++i) res[pos[i]] = s[i];
  printf("! %s\n", res);
  return 0;
}
