#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int inf = 1e9;
int mod = 1e9 + 7;
string recover(int l, int r) {
  cout << "? " << l << " " << r << "\n";
  cout.flush();
  int n = (r - l + 1);
  n = n * (n + 1) / 2;
  multiset<string> F;
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    F.insert(s);
  }
  cout << "? " << l + 1 << " " << r << "\n";
  cout.flush();
  int m = (r - l);
  m = m * (m + 1) / 2;
  for (int i = 0; i < m; i++) {
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    F.erase(F.find(s));
  }
  string temp[r - l + 2];
  for (auto &s : F) {
    temp[(int)s.length()] = s;
  }
  string ans;
  multiset<char> E;
  for (int i = 1; i <= r - l + 1; i++) {
    for (int j = 0; j < i; j++) {
      if (E.find(temp[i][j]) == E.end()) {
        ans.push_back(temp[i][j]);
      } else {
        E.erase(E.find(temp[i][j]));
      }
    }
    for (int j = 0; j < i; j++) {
      E.insert(temp[i][j]);
    }
  }
  return ans;
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  if (n == 1) {
    cout << "? 1 1\n";
    cout.flush();
    string s;
    cin >> s;
    cout << "! " << s << "\n";
    cout.flush();
    return 0;
  }
  string ans = recover(1, n);
  cout << "! " << ans << "\n";
  cout.flush();
  return 0;
}
