#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
string s, t;
vector<set<long long> > possible(120020), ps2(120020);
long long n;
set<string> asked;
string query(const string& q) {
  string rpl;
  cout << "? " << q << '\n';
  cout.flush();
  cin >> rpl;
  if (rpl == "0") exit(0);
  return rpl;
}
string p = "";
long long id = 0;
string gen() {
  if (id == 0) {
    for (long long i = 0; i < n; ++i) p[i] = 'a' + (i % 26);
  }
  if (id == 1) {
    for (long long i = 0; i < n; ++i) p[i] = 'a' + ((i / 26) % 26);
  } else if (id == 2) {
    for (long long i = 0; i < n; ++i) p[i] = 'a' + ((i / 26 / 26) % 26);
  }
  id++;
  return p;
}
vector<long long> frog[28];
void deal(bool first) {
  string from = gen(), to = query(from);
  for (long long i = 0; i < 27; ++i) frog[i].clear();
  for (long long i = 0; i < n; ++i) {
    frog[from[i] - 'a'].push_back(i);
  }
  if (first) {
    for (long long i = 0; i < n; ++i) {
      for (auto g : frog[to[i] - 'a']) possible[g].insert(i);
    }
  } else {
    for (long long i = 0; i < 10020; ++i) ps2[i].clear();
    for (long long i = 0; i < n; ++i) {
      for (auto g : frog[to[i] - 'a']) {
        if (possible[g].count(i)) ps2[g].insert(i);
      }
    }
    for (long long i = 0; i < 10020; ++i) possible[i] = ps2[i];
  }
}
signed main() {
  cin >> t;
  n = t.length();
  long long pr = n / 26, lf = n - pr * 26;
  for (char c = 'a'; c <= 'z'; ++c) {
    for (long long i = 0; i < pr; ++i) p += c;
    if (c - 'a' + 1 <= lf) p += c;
  }
  for (long long i = 1; i <= 3; ++i) deal(i == 1);
  s = t;
  for (long long i = 0; i < n; ++i) {
    s[i] = t[*possible[i].begin()];
  }
  cout << "! " << s << endl;
  return 0;
}
