#include <bits/stdc++.h>
using namespace std;
struct node {
  int l[26];
  int sum;
  bool operator<(const node& b) const {
    if (sum != b.sum) return sum > b.sum;
    for (int i = 0; i < 26; i++) {
      if (l[i] != b.l[i]) return l[i] > b.l[i];
    }
    return sum > b.sum;
  }
  node() {
    memset(l, 0, sizeof(l));
    sum = 0;
  }
};
multiset<node> S;
vector<node> V;
int cnt[26];
int main() {
  int n;
  cin >> n;
  if (n == 1) {
    cout << "? 1 1" << endl;
    string ans;
    cin >> ans;
    cout << "! " << ans << endl;
    return 0;
  }
  cout << "? " << 1 << " " << n << endl;
  for (int i = 0; i < n * (n + 1) / 2; i++) {
    string s;
    cin >> s;
    node tmp;
    tmp.sum = s.length();
    for (int j = 0; j < s.length(); j++) tmp.l[s[j] - 'a']++;
    S.insert(tmp);
  }
  cout << "? " << 1 << " " << n - 1 << endl;
  for (int i = 0; i < n * (n - 1) / 2; i++) {
    string s;
    cin >> s;
    node tmp;
    tmp.sum = s.length();
    for (int j = 0; j < s.length(); j++) tmp.l[s[j] - 'a']++;
    S.erase(S.find(tmp));
  }
  for (auto v : S) {
    V.push_back(v);
  }
  node tmp;
  V.push_back(tmp);
  sort(V.begin(), V.end());
  string ans;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 26; j++) {
      if (V[i].l[j] > V[i + 1].l[j]) ans.push_back(j + 'a');
    }
  }
  cout << "! " << ans << endl;
  return 0;
}
