#include <bits/stdc++.h>
using namespace std;
multiset<string> p[2][105];
char ans[105];
string tmp;
int cnt[3], n;
int main() {
  scanf("%d", &n);
  printf("? 1  1\n");
  fflush(stdout);
  scanf("%s", ans + 1);
  if (n == 1) {
    printf("! %c\n", ans[1]);
    return 0;
  }
  printf("? 2 %d\n", n);
  fflush(stdout);
  for (int i = 0; i < (n * (n - 1)) / 2; ++i) {
    cin >> tmp;
    sort(tmp.begin(), tmp.end());
    p[0][tmp.size()].insert(tmp);
  }
  printf("? 1 %d\n", n);
  fflush(stdout);
  for (int i = 0; i < (n * (n + 1)) / 2; ++i) {
    cin >> tmp;
    sort(tmp.begin(), tmp.end());
    p[1][tmp.size()].insert(tmp);
  }
  for (int i = 2; i <= n; ++i) {
    while (p[0][i].size()) {
      p[1][i].erase(p[1][i].find(*p[0][i].begin()));
      p[0][i].erase(p[0][i].begin());
    }
  }
  int vis[2][200] = {0};
  int cur = 0;
  vis[cur][ans[1] - 'a']++;
  for (int i = 2; i <= n; ++i) {
    string tmp = *p[1][i].begin();
    for (int j = 0; j < i; ++j) {
      vis[cur ^ 1][tmp[j] - 'a']++;
    }
    for (int j = 0; j < 26; ++j) {
      if (vis[cur][j] != vis[cur ^ 1][j]) {
        ans[i] = j + 'a';
      }
    }
    memset(vis[cur], 0, sizeof(vis[cur]));
    cur ^= 1;
  }
  printf("! ");
  ans[n + 1] = 0;
  printf("%s\n", ans + 1);
}
