#include <bits/stdc++.h>
using namespace std;
template <typename T>
void __read(T &a) {
  cin >> a;
}
template <typename T, typename... Args>
void __read(T &a, Args &...args) {
  cin >> a;
  __read(args...);
}
constexpr long long M7 = 1000000007ll;
constexpr long long M9 = 1000000009ll;
constexpr long long MFFT = 998244353ll;
template <class T>
void outv(T &a) {
  for (auto &x : a) cout << x << ' ';
}
static mt19937 rnd(static_cast<unsigned>(
    chrono::steady_clock::now().time_since_epoch().count()));
template <class T>
static auto __super_speed__ = (ios_base::sync_with_stdio(0), cin.tie(0));
vector<string> query(int l, int r) {
  cout << "? " << l + 1 << ' ' << r + 1 << endl;
  vector<string> res((r - l + 2) * (r - l + 1) / 2);
  for (auto &s : res) {
    cin >> s;
    sort((s).begin(), (s).end());
  }
  sort((res).begin(), (res).end());
  return res;
}
int32_t main() {
  int n;
  __read(n);
  auto res1 = query(0, n - 1);
  if (n == 1) {
    cout << "! " << res1[0] << endl;
    return 0;
  }
  auto res2 = query(0, n - 2);
  vector<string> res(n);
  set_difference((res1).begin(), (res1).end(), (res2).begin(), (res2).end(),
                 res.begin());
  sort((res).begin(), (res).end(), [](const string &s, const string &t) {
    return s.length() < t.length();
  });
  string s(n, '\0');
  for (int i = 0; i < n; ++i) {
    vector<int> cnt(26);
    for (auto &c : res[i]) {
      cnt[c - 'a']++;
    }
    for (int j = 0; j < i; ++j) {
      cnt[s[n - j - 1] - 'a']--;
    }
    for (int j = 0; j < cnt.size(); ++j) {
      if (cnt[j] != 0) {
        s[n - i - 1] = 'a' + j;
      }
    }
  }
  cout << "! " << s << endl;
  return 0;
}
