简单拓扑排序
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define inf -0x3f3f3f3f
#define lson k<<1, L, mid
#define rson k<<1|1, mid+1, R
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long ll;
const int maxn=100;
vector<int>G[maxn];
int degree[maxn];
int vis[maxn];
int cun[maxn];
int m;
int topcode(){
priority_queue<int,vector<int>,greater<int> >Q;
int num=26;
for(int i=0;i<=25;i++){
if(degree[i]==0)
Q.push(i);
}
int case1=0;
while(!Q.empty()){
case1++;
int u=Q.top();
Q.pop();
num--;
cun[case1]=u;
for(int i=0;i<G[u].size();i++){
degree[G[u][i]]--;
if(degree[G[u][i]]==0)
Q.push(G[u][i]);
}
}
if(num>0)
return 0;
else
return 1;
}
int main(){
int t;
int n;
while(scanf("%d",&n)!=EOF){
mem0(degree);
mem0(vis);
for(int i=0;i<=100;i++)
G[i].clear();
char x,y;
for(int i=0;i<n;i++){
cin>>x>>y;
int a=x-'A';
int b=y-'A';
G[a].push_back(b);
degree[b]++;
}
int flag=topcode();
if(flag==0)
cout<<"Stupid Ant!"<<endl;
else{
char c[100];
for(int i=1;i<=26;i++)
c[i]='A'+cun[i];
for(int i=1;i<=26;i++)
cout<<c[i];
cout<<endl;
}
}
return 0;
}