#include <bits/stdc++.h>
using namespace std;
const int maxt = 1e4 + 5;
int n;
string s1[maxt], s2[maxt], tmp[maxt];
map<string, int> used;
int getint() {
  char ch;
  int res = 0, p;
  while (!isdigit(ch = getchar()) && (ch ^ '-'))
    ;
  p = ch == '-' ? ch = getchar(), -1 : 1;
  while (isdigit(ch)) res = (res << 3) + (res << 1) + (ch ^ 48), ch = getchar();
  return res * p;
}
char cal(const string &a, const string &b) {
  int cnt[30] = {0};
  memset(cnt, 0, sizeof(cnt));
  for (int i = (0); i <= ((int)a.size() - 1); ++i) cnt[a[i] - 'a']++;
  for (int i = (0); i <= ((int)b.size() - 1); ++i) cnt[b[i] - 'a']--;
  for (int i = (0); i <= (25); ++i)
    if (cnt[i]) return i + 'a';
}
bool cmp(const string &a, const string &b) { return a.size() > b.size(); }
int main() {
  n = getint();
  printf("? 1 %d\n", n);
  fflush(stdout);
  int tot1 = (1 + n) * n / 2;
  for (int i = (1); i <= (tot1); ++i) {
    cin >> s1[i];
    sort(s1[i].begin(), s1[i].end());
    used[s1[i]]++;
  }
  if (n == 1) {
    cout << "! " << s1[1] << endl;
    return 0;
  }
  printf("? 1 %d\n", n - 1);
  fflush(stdout);
  int tot2 = (1 + n - 1) * (n - 1) / 2;
  for (int i = (1); i <= (tot2); ++i) {
    cin >> s2[i];
    sort(s2[i].begin(), s2[i].end());
    used[s2[i]]--;
  }
  int tott = 0;
  for (int i = (1); i <= (tot1); ++i)
    if (used[s1[i]]) tmp[++tott] = s1[i], used[s1[i]]--;
  sort(tmp + 1, tmp + 1 + n, cmp);
  string ans;
  for (int i = (1); i <= (n - 1); ++i) ans += cal(tmp[i], tmp[i + 1]);
  ans += tmp[n][0];
  cout << "! " << ans << endl;
  return 0;
}
