#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);   }   