#include<bits/stdc++.h>
using namespace std ;
#define F first
#define S second
const int N = 2e5+5 ;
const int M = 4e5+5 ;
int n , m , vis[M] , vis1[N] , vis2[N] ;
vector<pair<int,int>> nei[N] ;
vector<int> path ;
int GetMove(){
int ret ; cin >> ret ; return ret ;
}
void MakeMove(int v){
cout << v << endl ;
}
bool checkdfs(int node){
vis1[node] = 1 ;
for(auto it:nei[node]){
if(vis[it.S]) continue ;
if(it.F==1){
vis2[node] = 1 ; vis1[node] = 0 ; return true ;
}
if(vis1[it.F]) continue ;
vis[it.S] = 1 ;
if(checkdfs(it.F)){
vis1[node] = 0 ; return true ;
}
vis[it.S] = 0 ;
}
vis1[node] = 0 ;
return false ;
}
bool check(){
for(auto it:nei[1]){
if(vis[it.S] || vis2[it.F]) continue ;
vis[it.S] = 1 ; vis2[it.F] = 1 ;
if(!checkdfs(it.F)) return false ;
}
return true ;
}
bool dfs(int node){
path.push_back(node) ;
if(node==1) return true ;
for(auto it:nei[node]){
if(vis[it.S]) continue ;
vis[it.S] = 1 ;
if(dfs(it.F)) return true ;
vis[it.S] = 0 ;
}
path.pop_back() ;
return false ;
}
int main(){
cin >> n >> m ;
for(int i=0 ; i<m ; i++){
int u , v ; cin >> u >> v ;
nei[u].push_back({v,i}) ; nei[v].push_back({u,i}) ;
}
if(!check()){
cout << "NO" << endl ;
return 0 ;
}
cout << "YES\n" ;
memset(vis,0,sizeof(vis)) ;
while(true){
int temp = GetMove() ;
if(!temp) break ;
for(auto it:nei[1]){
if(it.F==temp) vis[it.S] = 1 ;
}
bool flag = dfs(temp) ;
assert(flag) ; //
for(int i=1 ; i<path.size() ; i++) MakeMove(path[i]) ;
}
}