板子来于hs
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+100;
int n, m;
char s1[N], s2[N];
int len;
int vis[30];
vector<int> g[N*30];
vector<int> v;
int d[N*30];
vector<int> res;
void tobo(){
while(1){
int tmp = -1;
for(auto u:v){
if(d[u] == 0){
tmp = u;
break;
}
}
if(tmp == -1) break;
res.push_back(tmp%26);
d[tmp] = -1;
for(auto u:g[tmp]){
d[u]--;
}
}
if(res.size() == n) {
for(auto u:res){
cout << (char)(u+'a');
}
cout << "\n";
}
else cout << "-1\n";
}
int main(){
cin >> n >> m;
for(int i = 0; i < m*(m-1)/2; i++){
cin >> s1 >> len;
if(len == 0) continue;
cin >> s2;
memset(vis, 0, sizeof vis);
int pre = -1;
for(int j = 0; j < len; j++){
int u = (s2[j]-'a') + 26*vis[s2[j]-'a'];
v.push_back(u);
vis[s2[j]-'a']++;
if(pre == -1) {
pre = u;
continue;
}
g[pre].push_back(u);
d[u]++;
pre = u;
}
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(),v.end()),v.end());
if(v.size() != n) {
cout << "-1\n";
return 0;
}
tobo();
return 0;
}