#include <bits/stdc++.h>
using namespace std;
multiset<string> query[2][105];
vector<string> restoreString(105);
void ask(int l, int r, int qq) {
  if (r < l) exit(0);
  cout << "? " << l << " " << r << endl;
  int cnt = ((r - l + 1LL) * (r - l + 2LL)) / 2LL;
  string s;
  for (int i = 1; i <= cnt; i++) {
    cin >> s;
    sort(s.begin(), s.end());
    query[qq][s.length()].insert(s);
  }
}
void findDiff(int n) {
  for (int i = 1; i <= n; i++) {
    while (!query[0][i].empty()) {
      string cur = *query[0][i].begin();
      query[1][i].erase(query[1][i].find(cur));
      query[0][i].erase(query[0][i].find(cur));
    }
  }
  for (int i = 1; i <= n; i++) {
    restoreString[i] = *query[1][i].begin();
  }
}
char askLetter(int pos) {
  cout << "? " << pos << " " << pos << endl;
  char ans;
  cin >> ans;
  return ans;
}
int main() {
  int n;
  cin >> n;
  if (n == 1) {
    char a1 = askLetter(1);
    cout << "! " << a1 << endl;
    return 0;
  }
  if (n == 2) {
    char a1 = askLetter(1);
    char a2 = askLetter(2);
    cout << "! " << a1 << a2 << endl;
    return 0;
  }
  if (n == 3) {
    char a1 = askLetter(1);
    char a2 = askLetter(2);
    char a3 = askLetter(3);
    cout << "! " << a1 << a2 << a3 << endl;
    return 0;
  }
  ask(1, n - 1, 0);
  ask(1, n, 1);
  findDiff(n);
  string ans = "";
  int cntt[30];
  for (int i = 1; i <= n; i++) {
    for (int kk = 0; kk < 30; kk++) cntt[kk] = 0;
    for (int j = 0; j < i - 1; j++) cntt[restoreString[i - 1][j] - 'a']++;
    for (int j = 0; j < i; j++) cntt[restoreString[i][j] - 'a']--;
    for (int kk = 0; kk < 30; kk++)
      if (cntt[kk] < 0) ans.push_back(('a' + kk));
  }
  reverse(ans.begin(), ans.end());
  cout << "! " << ans << endl;
  return 0;
}
