#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using P = pair; constexpr int INF = 1001001001; constexpr int mod = 1000000007; // constexpr int mod = 998244353; template inline bool chmax(T& x, T y){ if(x < y){ x = y; return true; } return false; } template inline bool chmin(T& x, T y){ if(x > y){ x = y; return true; } return false; } int f[26], indeg[26], g[26][26]; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; string s; cin >> N; for(int i = 0; i < N; ++i){ cin >> s; int n = s.length(); for(int j = 0; j < n; ++j){ f[s[j] - 'A'] = 1; if(j == n - 1) continue; g[s[j] - 'A'][s[j + 1] - 'A'] = 1; } } cin >> M; for(int i = 0; i < M; ++i){ cin >> s; int n = s.length(); for(int j = 0; j < n; ++j){ f[s[j] - 'A'] = 1; if(j == n - 1) continue; g[s[j] - 'A'][s[j + 1] - 'A'] = 1; } } for(int i = 0; i < 26; ++i){ for(int j = 0; j < 26; ++j){ if(g[i][j]) indeg[j] += 1; } } queue que; for(int i = 0; i < 26; ++i){ if(f[i] && !indeg[i]) que.emplace(i); } vector ord; while(!que.empty()){ int u = que.front(); que.pop(); ord.emplace_back(u); for(int v = 0; v < 26; ++v){ if(g[u][v] && --indeg[v] == 0) que.emplace(v); } } int n = ord.size(); for(int i = 1; i < n; ++i){ bool ok = false; for(int j = 0; j < 26; ++j){ if(g[j][ord[i]]) ok = true; } if(!ok){ cout << -1 << endl; return 0; } } for(int i : ord) cout << (char)('A' + i); cout << endl; return 0; }