#include <bits/stdc++.h>
using namespace std;
int new_pozs[10007];
int main() {
  string init;
  cin >> init;
  string query_s = init;
  int n = init.size();
  int box_size = 26 * 26;
  char ch = 0;
  for (int box_start = 0; box_start < n; box_start += box_size) {
    for (int i = 0; i < box_size; i++) {
      if (box_start + i < n) {
        query_s[box_start + i] = ch + 'a';
      }
    }
    ch++;
    if (ch == 26) ch = 0;
  }
  cout << "? " << query_s << endl;
  string response;
  cin >> response;
  for (int i = 0; i < response.size(); i++) {
    new_pozs[i] += box_size * (response[i] - 'a');
  }
  box_size /= 26;
  ch = 0;
  for (int box_start = 0; box_start < n; box_start += box_size) {
    for (int i = 0; i < box_size; i++) {
      if (box_start + i < n) {
        query_s[box_start + i] = ch + 'a';
      }
    }
    ch++;
    if (ch == 26) ch = 0;
  }
  cout << "? " << query_s << endl;
  cin >> response;
  for (int i = 0; i < response.size(); i++) {
    new_pozs[i] += box_size * (response[i] - 'a');
  }
  box_size /= 26;
  ch = 0;
  for (int box_start = 0; box_start < n; box_start += box_size) {
    for (int i = 0; i < box_size; i++) {
      if (box_start + i < n) {
        query_s[box_start + i] = ch + 'a';
      }
    }
    ch++;
    if (ch == 26) ch = 0;
  }
  cout << "? " << query_s << endl;
  cin >> response;
  for (int i = 0; i < response.size(); i++) {
    new_pozs[i] += box_size * (response[i] - 'a');
  }
  string new_build = init;
  for (int i = 0; i < n; i++) {
    new_build[new_pozs[i]] = init[i];
  }
  cout << "! " << new_build << endl;
}
