#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
long long mod(long long a, long long b) {
  if (a > b)
    return (a - b);
  else
    return (b - a);
}
double distance(long long x1, long long y1, long long x2, long long y2) {
  return sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2) * 1.0);
}
bool isPerfectSquare(long double x) {
  long double sr = sqrt(x);
  return ((sr - floor(sr)) == 0);
}
bool palindrome(string s, long long i, long long j) {
  if (i > j) return true;
  if (s[i] != s[j])
    return false;
  else
    return palindrome(s, i + 1, j - 1);
}
bool isPrime(long long n) {
  if (n <= 1) return false;
  if (n <= 3) return true;
  if (n % 2 == 0 || n % 3 == 0) return false;
  for (long long i = 5; i * i <= n; i = i + 6)
    if (n % i == 0 || n % (i + 2) == 0) return false;
  return true;
}
bool isPowerOfTwo(long long n) {
  if (n == 0) return false;
  return (ceil(log2(n)) == floor(log2(n)));
}
long long nPr(long long n, long long r) {
  long long sum = 1;
  for (long long i = n; i > (n - r); i--) sum = sum * i;
  return sum;
}
signed main() {
  cout << "? " << 1 << " " << 2 << "\n";
  fflush(stdout);
  long long mul1;
  cin >> mul1;
  cout << "? " << 2 << " " << 3 << "\n";
  fflush(stdout);
  long long mul2;
  cin >> mul2;
  cout << "? " << 4 << " " << 5 << "\n";
  fflush(stdout);
  long long mul3;
  cin >> mul3;
  cout << "? " << 5 << " " << 6 << "\n";
  fflush(stdout);
  long long mul4;
  cin >> mul4;
  cout << "! ";
  vector<long long> v{4, 8, 15, 16, 23, 42};
  map<long long, bool> mp;
  for (long long i = 0; i < 6; i++) mp[v[i]] = true;
  for (long long i = 0; i < 6; i++) {
    if (mul1 % v[i] == 0 && mp[v[i]]) {
      if (binary_search(v.begin(), v.end(), mul1 / v[i]) && mp[mul1 / v[i]] &&
          mul1 / v[i] != v[i]) {
        if (mul2 % v[i] == 0 && mp[v[i]]) {
          if (binary_search(v.begin(), v.end(), mul2 / v[i]) &&
              mp[mul2 / v[i]] && v[i] != mul2 / v[i]) {
            cout << mul1 / v[i] << " " << v[i] << " " << mul2 / v[i] << " ";
            mp[mul1 / v[i]] = false;
            mp[v[i]] = false;
            mp[mul2 / v[i]] = false;
            break;
          }
        } else if (mul2 % (mul1 / v[i]) == 0 && mp[mul1 / v[i]]) {
          if (binary_search(v.begin(), v.end(), v[i]) && mp[v[i]] &&
              (mul1 / v[i]) != v[i]) {
            cout << v[i] << " " << mul1 / v[i] << " " << mul2 / (mul1 / v[i])
                 << " ";
            mp[mul1 / v[i]] = false;
            mp[v[i]] = false;
            mp[mul2 / (mul1 / v[i])] = false;
            break;
          }
        }
      }
    }
  }
  for (long long i = 0; i < 6; i++) {
    if (mul3 % v[i] == 0 && mp[v[i]]) {
      if (binary_search(v.begin(), v.end(), mul3 / v[i]) && mp[mul3 / v[i]] &&
          mul3 / v[i] != v[i]) {
        if (mul4 % v[i] == 0 && mp[v[i]]) {
          if (binary_search(v.begin(), v.end(), mul4 / v[i]) &&
              mp[mul4 / v[i]] && v[i] != mul4 / v[i]) {
            cout << mul3 / v[i] << " " << v[i] << " " << mul4 / v[i] << " ";
            mp[mul3 / v[i]] = false;
            mp[v[i]] = false;
            mp[mul4 / v[i]] = false;
            break;
          }
        } else if (mul4 % (mul3 / v[i]) == 0 && mp[mul3 / v[i]]) {
          if (binary_search(v.begin(), v.end(), v[i]) && mp[v[i]] &&
              (mul3 / v[i]) != v[i]) {
            cout << v[i] << " " << mul3 / v[i] << " " << mul4 / (mul3 / v[i])
                 << " ";
            mp[mul3 / v[i]] = false;
            mp[v[i]] = false;
            mp[mul4 / (mul4 / v[i])] = false;
            break;
          }
        }
      }
    }
  }
  return 0;
}
