#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int mod = 1000000007;
const double dancila = 3.14159265359;
const double eps = 1e-9;
int n;
map<string, int> m1, m2;
string pref[102];
int frq[28], frq2[28];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n;
  if (n <= 3) {
    string ans;
    for (int i = 1; i <= n; ++i) {
      cout << "? " << i << " " << i << endl;
      string p;
      cin >> p;
      ans += p;
    }
    cout << "! " << ans << endl;
    return 0;
  }
  cout << "? " << 1 << " " << n << endl;
  for (int i = 1; i <= n * (n + 1) / 2; ++i) {
    string ss;
    cin >> ss;
    sort(ss.begin(), ss.end());
    m1[ss]++;
  }
  cout << "? " << 2 << " " << n << endl;
  for (int i = 1; i <= n * (n - 1) / 2; ++i) {
    string ss;
    cin >> ss;
    sort(ss.begin(), ss.end());
    m2[ss]++;
  }
  for (map<string, int>::iterator it = m1.begin(); it != m1.end(); ++it) {
    string x = it->first;
    if (it->second != m2[x]) pref[(int)x.size()] = x;
  }
  string sol;
  for (int i = 1; i <= n; ++i) {
    memset(frq2, 0, sizeof(frq2));
    for (int j = 0; j < pref[i].size(); ++j) frq2[pref[i][j] - 'a']++;
    for (int j = 0; j <= 25; ++j) {
      if (frq2[j] > frq[j]) {
        char ans = 'a' + j;
        sol += ans;
      }
      frq[j] = frq2[j];
    }
  }
  cout << "! " << sol << endl;
  return 0;
}
