#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18, MOD = 1e9 + 7, MOD2 = 1e6 + 3;
vector<int> g[1000001];
int p[1000001], c[1000001], a[1000001], sz[1000001], root, n;
char sub(string a, string b) {
  for (int i = 0; i < b.size(); i++) {
    if (a[i] != b[i]) return a[i];
  }
  return a.back();
}
vector<string> query(int l, int r) {
  vector<string> v;
  cout << "? " << l << ' ' << r << endl;
  fflush(stdout);
  for (int i = 0; i < (r - l + 1) * (r - l + 2) / 2; i++) {
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    v.push_back(s);
  }
  return v;
}
int main() {
  int n;
  cin >> n;
  if (n == 1) {
    auto a = query(1, n);
    cout << "! " << a[0] << endl;
    fflush(stdout);
    return 0;
  }
  auto a = query(1, n);
  auto b = query(1, n - 1);
  sort(a.begin(), a.end());
  sort(b.begin(), b.end());
  vector<string> suf;
  int l = 0, r = 0;
  while (l < a.size() || r < b.size()) {
    if (r == b.size() || a[l] != b[r]) {
      suf.push_back(a[l]);
      l++;
    } else {
      l++, r++;
    }
  }
  sort(suf.begin(), suf.end(),
       [&](string& a, string& b) { return a.size() < b.size(); });
  string ans;
  ans += suf[0];
  for (int i = 1; i < suf.size(); i++) ans += sub(suf[i], suf[i - 1]);
  reverse(ans.begin(), ans.end());
  cout << "! " << ans << endl;
  fflush(stdout);
}
