/*
Name: 判断无向图是否连通+统计顶点的度数
Copyright:
Author: Try86
Date: 14/04/12 23:02
Description: 邻接链表存图
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 105;
int deg[N]; //统计顶点的度数
bool map[N][N], color[N];
struct node {
int v;
node *next;
node (int vv, node *p) {
v = vv;
next = p;
}
};
struct graph {
node *link;
}G[N];
int counts;
void init(int n) {//初始化图
for (int i=1; i<=n; ++i) {
G[i].link = NULL;
}
return ;
}
void buildG(int u, int v) {//建图
node *p = new node(v, G[u].link);
G[u].link = p;
return ;
}
void dfsVisit(int u) {
color[u] = false;
for (node *p=G[u].link; p; p=p->next) {
if (color[p->v]) dfsVisit(p->v);
}
return ;
}
void dfs(int n) {//dfs判断图是否连通
for (int i=1; i<=n; ++i) color[i] = true;
for (int i=1; i<=n; ++i) {
if (color[i]) {
++counts;
if (counts > 1) break;
dfsVisit(i);
}
}
return ;
}
void del(int u) {//释放邻接链表所占内存
node *p = G[u].link;
while (G[u].link) {
G[u].link = p->next;
delete p;
p = G[u].link;
}
return ;
}
int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
memset(deg, 0, sizeof(deg));
memset(map, false, sizeof(map));
init(n);
int u, v;
for (int i=0; i<m; ++i) {
scanf ("%d%d", &u, &v);
if (!map[u][v] || !map[v][u]) {//去重边
map[u][v] = map[v][u] = true;
buildG(u, v);
buildG(v, u);
}
++deg[u];
++deg[v];
}
counts = 0;
dfs(n);
if (counts > 1) {
printf ("Graph is not connected!\n");
continue;
}
counts = 0;
for (int i=1; i<=n; ++i) {
if (deg[i]%2) ++counts;
}
if (counts == 2) {
printf ("have Euler path\n");
continue;
}
if (counts == 0) {
printf ("have Euler Circuit\n");
continue;
}
printf ("have no Euler path\n");
for (int i=1; i<=n; ++i) del(i);
}
return 0;
}