#include<iostream>
#include<vector>
using namespace std;
vector<int> adj[501];
bool vis[501]={false};
void dfs(int u,int depth){
vis[u]=true;
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
if(vis[v]!=true){
dfs(v,depth+1);
}
}
}//对u所在的连通块进行深搜
/*void dfstra(){//对每个连通块进行访问
for(int u=1;u<=n;u++){
if(vis[u]==false){
dfs(u,1);
}
}
}*/
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n,m;
cin>>n>>m;
int degree[n+1]={};
for(int i=0;i<m;i++){
int start,end;
cin>>start>>end;
degree[start]++;
degree[end]++;
adj[start].push_back(end);
adj[end].push_back(start);
}
dfs(1,1);
int flag=1;
for(int i=1;i<=n;i++){
if(vis[i]==false){
flag=0;break;
}
}
for(int i=1;i<=n;i++){
if(i==1)
cout<<degree[i];
else
cout<<' '<<degree[i];
}
cout<<endl;
int sign=1,cnt=0;
for(int i=1;i<=n;i++){
if(degree[i]%2!=0){
sign=0;cnt++;
}
}
if(flag==1&&sign==0&&cnt==2) cout<<"Semi-Eulerian"<<endl;
else if(flag==1&&sign==1&&cnt==0) cout<<"Eulerian"<<endl;
else cout<<"Non-Eulerian"<<endl;
return 0;
}