#include <bits/stdc++.h>
using namespace std;
long long n;
string s, ans = "";
multiset<string> mas[105];
vector<string> bol[105], myvec;
bool f;
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n;
  if (n == 1) {
    cout << "? 1 1" << '\n';
    fflush(stdout);
    cin >> s;
    cout << "! " << s << '\n';
    fflush(stdout);
    return 0;
  }
  cout << "? 2 " << n << '\n';
  fflush(stdout);
  for (int i = 1; i <= (n * (n - 1) / 2); i++) {
    cin >> s;
    sort(s.begin(), s.end());
    mas[(long long)s.size()].insert(s);
  }
  cout << "? 1 " << n << '\n';
  fflush(stdout);
  for (int i = 1; i <= (n * (n + 1) / 2); i++) {
    cin >> s;
    sort(s.begin(), s.end());
    bol[(long long)s.size()].push_back(s);
  }
  myvec.push_back(bol[n][0]);
  for (int i = n - 1; i >= 1; i--) {
    for (int j = 0; j < (long long)bol[i].size(); j++)
      if (mas[i].find(bol[i][j]) == mas[i].end()) {
        myvec.push_back(bol[i][j]);
        break;
      } else
        mas[i].erase(mas[i].find(bol[i][j]));
  }
  myvec.push_back("LOL");
  reverse(myvec.begin(), myvec.end());
  for (int i = n - 1; i >= 1; i--) {
    f = false;
    for (int j = 0; j < i; j++)
      if (myvec[i][j] != myvec[i + 1][j]) {
        f = true;
        ans += myvec[i + 1][j];
        break;
      }
    if (!f) ans += myvec[i + 1][i];
  }
  ans += myvec[1][0];
  reverse(ans.begin(), ans.end());
  cout << "! " << ans << '\n';
  fflush(stdout);
  return 0;
}
