#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using Vi = vector<int>;
using Pii = pair<int, int>;
int uplg(int n) { return 32 - __builtin_clz(n); }
int uplg(ll n) { return 64 - __builtin_clzll(n); }
void run();
int main() {
  cin.sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(18);
  run();
  return 0;
}
using Info = array<int, 26>;
int getN() {
  int n;
  cin >> n;
  return n;
}
vector<string> doAsk(int b, int e) {
  cout << "? " << b + 1 << ' ' << e << endl;
  vector<string> ret((e - b) * (e - b + 1) / 2);
  for (auto& f : (ret)) cin >> f;
  return ret;
}
void answer(const string& s) {
  cout << "! " << s << endl;
  exit(0);
}
vector<Info> ask(int b, int e) {
  vector<Info> ret;
  for (auto& s : (doAsk(b, e))) {
    ret.emplace_back();
    for (auto& c : (s)) ret.back()[c - 'a']++;
  }
  return ret;
}
void run() {
  int n = getN();
  auto A = ask(0, n);
  if (n == 1) {
    string s;
    for (int i = (0); i < (26); i++)
      if (A[0][i]) s.push_back(char(i + 'a'));
    answer(s);
    return;
  }
  auto B = ask(1, n);
  for (auto& s : (B)) A.erase(find((A).begin(), (A).end(), s));
  assert(int((A).size()) == n);
  sort((A).begin(), (A).end(), [&](const Info& l, const Info& r) {
    return accumulate((l).begin(), (l).end(), 0) <
           accumulate((r).begin(), (r).end(), 0);
  });
  string ans;
  Info last = {};
  for (auto& s : (A)) {
    for (int i = (0); i < (26); i++) {
      if (s[i] == last[i] + 1) {
        ans.push_back(char(i + 'a'));
        break;
      }
    }
    last = s;
  }
  answer(ans);
}
