#include <bits/stdc++.h>
using namespace std;
int n;
bool ordSize(string a, string b) { return (int)a.size() < (int)b.size(); }
vector<string> query(int L, int R) {
  cout << "? " << L << " " << R << endl;
  int sz = R - L + 1;
  int qtd = sz * (sz + 1);
  qtd /= 2;
  vector<string> ans;
  for (int i = 1; i <= qtd; i++) {
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    ans.push_back(s);
  }
  return ans;
}
char getDiff(string A, string B) {
  for (int i = 0; i < A.size(); i++)
    if (A[i] != B[i]) return B[i];
  return B.back();
}
string findString(int L, int R) {
  if (L == R) {
    vector<string> ans = query(L, R);
    return ans[0];
  }
  vector<string> prefixes;
  vector<string> A = query(L + 1, R);
  vector<string> B = query(L, R);
  multiset<string> s(A.begin(), A.end());
  for (int i = 0; i < B.size(); i++) {
    auto it = s.find(B[i]);
    if (it != s.end())
      s.erase(it);
    else
      prefixes.push_back(B[i]);
  }
  sort(prefixes.begin(), prefixes.end(), ordSize);
  string ans = prefixes[0];
  for (int i = 1; i < (int)prefixes.size(); i++)
    ans.push_back(getDiff(prefixes[i - 1], prefixes[i]));
  return ans;
}
void answer(string ans) {
  cout << "! " << ans << endl;
  exit(0);
}
int main() {
  cin >> n;
  answer(findString(1, n));
}
