#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int N = 110031;
string st;
int n;
string res[N];
int ans[N];
string answ;
int get_bit(int val, int ps) {
  for (int i = 0; i < ps; i++) {
    val /= 26;
  }
  return val % 26;
}
bool valid_move(int a, int b) {
  for (int j = 0; j < 3; j++) {
    int should_be = get_bit(a, j);
    if (res[j][b] != should_be + 'a') return false;
  }
  return true;
}
string get_qu(int n, int lev) {
  string ret;
  for (int i = 0; i < n; i++) {
    int here = get_bit(i, lev);
    char c = here + 'a';
    ret += c;
  }
  return ret;
}
string make_query(string st) {
  cout << "? " << st << endl;
  string ret;
  cin >> ret;
  return ret;
}
void tell_answer(string st) { cout << "! " << st << endl; }
int main() {
  cin >> st;
  n = st.size();
  for (int i = 0; i < 3; i++) {
    string qu_string = get_qu(n, i);
    res[i] = make_query(qu_string);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (valid_move(i, j)) ans[i] = j;
    }
  }
  for (int i = 0; i < st.size(); i++) {
    answ += st[ans[i]];
  }
  tell_answer(answ);
  return 0;
}
