#include #include #include #include using namespace std; const int MAXN = 100; struct Word { int length; char s[1 + MAXN]; int preffix[1 + MAXN]; bool operator < (const Word &other) const { return length < other.length; } }; Word v[1 + MAXN]; vector g[1 + MAXN]; bool dp[1 + MAXN]; void BuildPreffix(int x) { int i = 0; for (int j = 2; j <= v[x].length; j++) { while (i && v[x].s[i + 1] != v[x].s[j]) i = v[x].preffix[i]; if (v[x].s[i + 1] == v[x].s[j]) i++; v[x].preffix[j] = i; } } void KMP(int x, int y) { int i = 0; for (int j = 1; j <= v[y].length; j++) { while (i && v[x].s[i + 1] != v[y].s[j]) i = v[x].preffix[i]; if (v[x].s[i + 1] == v[y].s[j]) i++; if (i == v[x].length) { g[j].push_back(j - v[x].length); i = v[x].preffix[i]; } } } bool Try(int x) { for (int i = 1; i <= v[x].length; i++) { g[i].clear(); dp[i] = false; } for (int j = 1; j < x; j++) KMP(j, x); dp[0] = true; for (int i = 1; i <= v[x].length; i++) for (int j = 0; j < g[i].size() && !dp[i]; j++) dp[i] |= dp[g[i][j]]; return dp[v[x].length]; } int main() { //freopen("b.in", "r", stdin); //freopen("b.out", "w", stdout); int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%s", v[i].s + 1); v[i].length = strlen(v[i].s + 1); BuildPreffix(i); } sort(v + 1, v + n + 1); for (int i = n; i >= 2; i--) if (Try(i)) { printf("%s\n", v[i].s + 1); return 0; } printf("-1\n"); return 0; }