//判断有向图欧拉路
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX_N = 100;
const int MAX_M = 10000;
struct edge{
int v,next;
int len;
}E[MAX_M];
int p[MAX_N],eid;
void init(){
memset(p,-1,sizeof(p));
eid = 0;
}
void insert(int u,int v){
E[eid].v = v;
E[eid].next = p[u];
p[u] = eid++;
}//创建一个干净的空图
int n,m;
int degree[MAX_N];
int euler(){
int first = 0,last = 0; //定义的first和last用来记录入度与初度的差为-1的点以及1的点是哪个如果不存在那么值就是0
for(int i = 1;i <= n;i++){
if(degree[i] < -1 || degree[i] > 1){
cout << "It doesn't have an euler path!"<<endl;
return 0;
}else if(degree[i] == -1){
if(first != 0){
cout << "It doesn't have an euler path!"<<endl;
return 0;
}else{
first = i;
}
}else if(degree[i] == 1){
if(last != 0){
cout <<"It doesn't have an euler path!"<<endl;
return 0;
}else{
last = i;
}
}
}
if(first == 0 && last == 0){
cout << "It has an euler circuit!"<<endl;
return 1;
}else(first != 0 && last != 0){
cout <<"It has an euler path!"<<endl;
return first;
}
}
int main()
{
init();
memset(degree,0,sizeof(degree));
cin >> n >> m;
for(int i = 0;i < m;i++){
int u,v;
cin >> u >> v;
insert(u,v);
degree[u]--;
degree[v]++;
}
euler();
return 0;
} 有向图判断欧拉路