注意要判断是否为联通图
//
// main.cpp
// PATA1126
//
// Created by Phoenix on 2018/2/25.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
const int maxn = 510;
int n, m;
int father[maxn], num[maxn] = {0};
int findFather(int x) {
int a = x;
while(a != father[a]) {
a = father[a];
}
while(x != father[x]) {
int c = father[x];
father[x] = a;
x = c;
}
return a;
}
void Union(int a, int b) {
int faA = findFather(a);
int faB = findFather(b);
if(faA != faB) father[faA] = faB;
}
int main(int argc, const char * argv[]) {
for(int i = 0; i < maxn; i++) {
father[i] = i;
}
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++) {
int a, b;
scanf("%d %d", &a, &b);
num[a]++;
num[b]++;
Union(a, b);
}
int k = 0, odd = 0;
for(int i = 1; i <= n; i++) {
if(father[i] == i) k++;
if(num[i] % 2 == 1) odd++;
printf("%d", num[i]);
if(i < n) printf(" ");
else printf("\n");
}
if(k > 1) printf("Non-Eulerian\n");
else {
if(odd == 0) printf("Eulerian\n");
else if(odd == 2) printf("Semi-Eulerian\n");
else printf("Non-Eulerian\n");
}
return 0;
}