#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const long long inf = numeric_limits<long long>::max() / 2;
const long double eps = 1e-9;
const long double pi = acosl(-1);
template <typename T>
inline bool mineq(T& a, T b) {
  return (a > b) ? (a = b, 1) : 0;
}
template <typename T>
inline bool maxeq(T& a, T b) {
  return (a < b) ? (a = b, 1) : 0;
}
inline void solve(), read();
const string file = "";
signed main() {
  if (file != "") {
    freopen((file + ".in").c_str(), "r", stdin);
    freopen((file + ".out").c_str(), "w", stdout);
  }
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  ;
  read();
  solve();
  return 0;
}
long long n;
string t;
vector<long long> pos;
string ask(string& s) {
  cout << "? " << s << "\n" << flush;
  string t;
  cin >> t;
  if (t == "0") {
    exit(0);
  }
  return t;
}
void shuffle(string& s) {
  for (long long i = 0; i < n * n; i++) {
    swap(s[i % n], s[rand() % n]);
  }
}
inline void solve() {
  string s1 = "abcdefghijklmnopqrstuvwxyz";
  string s2 = "bcdefghijklmnopqrstuvwxyza";
  string s3 = "cdefghijklmnopqrstuvwxyzab";
  s1.resize(min(n, 26ll));
  s2.resize(min(n, 26ll));
  s3.resize(min(n, 26ll));
  for (long long i = 26; i < n; i++) {
    s1.push_back(s1[i % 26]);
    s2.push_back(s2[i % 26]);
    s3.push_back(s3[i % 26]);
  }
  shuffle(s1);
  shuffle(s2);
  shuffle(s3);
  string t1 = ask(s1);
  string t2 = ask(s2);
  string t3 = ask(s3);
  pos.assign(n, -1);
  for (long long i = 0; i < n; i++) {
    long long c1 = t1[i], c2 = t2[i], c3 = t3[i];
    for (long long j = 0; j < n; j++) {
      if (s1[j] == c1 && s2[j] == c2 && s3[j] == c3) {
        pos[i] = j;
        break;
      }
    }
  }
  string s = t;
  for (long long i = 0; i < n; i++) {
    s[pos[i]] = t[i];
  }
  cout << "! " << s << "\n" << flush;
}
inline void read() {
  cin >> t;
  n = (long long)((t).size());
}
