#include<bits/stdc++.h>
#define int long long
using namespace std;
int head[500005],cnt;
struct data{
int to;
int next;
};
data edge[100005];
void add_edge(int from,int to){
cnt++;
edge[cnt].to=to;
edge[cnt].next=head[from];
head[from]=cnt;
}
int n,m;
int degree[1005];
int t_degree[1005];
string ans;
void toposort(){
queue<int> q;
bool flag=false;
int kk=0;
for(int i=1;i<=n;i++){
if(degree[i]==0){
kk++;
q.push(i);
}
}
if(kk>=2) flag=true;
int ans1=0;
while(!q.empty()){
int sum=0;
int x=q.front();
q.pop();
ans=ans+char(x+'A'-1);
for(int i=head[x];i;i=edge[i].next){
degree[edge[i].to]--;
ans1=max(ans1,i);
if(degree[edge[i].to]==0){
q.push(edge[i].to);
sum++;
if(sum>=2) flag=true;
}
}
}
if(flag) cout<<"Sorted sequence cannot be determined.";
else {
cout<<"Sorted sequence determined after ";
cout<<ans1;
cout<<" relations:";
cout<<ans<<".";
}
return;
}
bool circle(){
queue<int> q;
for(int i=1;i<=n;i++){
t_degree[i]=degree[i];
}
for(int i=1;i<=n;i++){
if(t_degree[i]==0) q.push(i);
}
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=edge[i].next){
t_degree[edge[i].to]--;
if(t_degree[edge[i].to]==0) q.push(edge[i].to);
}
}
for(int i=1;i<=n;i++){
if(t_degree[i]) return false;
}
return true;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
string s;
cin>>s;
int u=s[0]-'A'+1;
int v=s[2]-'A'+1;
add_edge(u,v);
degree[v]++;
if(!circle()){
cout<<"Inconsistency found after "<<i<<" relations.";
return 0;
}
}
toposort();
return 0;
}