#include <bits/stdc++.h>
using namespace std;
vector<vector<string> > q;
vector<string> dummy;
void pergunta(int l, int r) {
  cout << "? " << l << " " << r << endl;
  q.push_back(dummy);
  for (int i = l; i <= r; i++)
    for (int j = i; j <= r; j++) {
      string str;
      cin >> str;
      sort(str.begin(), str.end());
      q.back().push_back(str);
    }
}
void giveAns(string str) {
  cout << "! ";
  for (auto e : str) cout << e;
  cout << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  if (n == 1) {
    pergunta(1, 1);
    giveAns(q[0][0]);
    return 0;
  }
  pergunta(1, n - 1);
  pergunta(1, n);
  multiset<string> myStrings;
  vector<string> verified;
  for (auto e : q[0]) myStrings.insert(e);
  for (auto e : q[1]) {
    auto it = myStrings.find(e);
    if (it == myStrings.end())
      verified.push_back(e);
    else
      myStrings.erase(it);
  }
  sort(verified.begin(), verified.end(),
       [&](string a, string b) { return (int)(a.size()) < (int)(b.size()); });
  string ans;
  ans.push_back(verified[0][0]);
  for (int i = 1; i < (int)(verified.size()); i++) {
    int ptr = 0;
    while (ptr < (int)(verified[i - 1].size()) &&
           verified[i - 1][ptr] == verified[i][ptr]) {
      ptr++;
    }
    ans.push_back(verified[i][ptr]);
  }
  reverse(ans.begin(), ans.end());
  giveAns(ans);
}
