#define AK return
#define USACO 0;
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
const int N = 2e5 + 5;
int m, n;
vector<int> G[N];
int cereal[N];
int ord[N] , tot = 0;
bool pri[N] , vis[N] , used[N];
bool out[N];
int in[N];
vector<int> e[N];
bool find( int x ){
for(int i = 0 ; i < G[x].size( ) ; i++ ){
int v = G[x][i];
if( !used[v] ){
used[v] = 1;
if( cereal[v] == 0 ){
cereal[v] = x;
return 1;
}
if( find( cereal[v] ) ){
e[x].push_back( cereal[v] );
in[cereal[v]]++;
cereal[v] = x;
return 1;
}
}
}
return 0;
}
vector<int> ans;
void toposort( ){
queue<int> q;
for( int i = 1 ; i <= m ; i++ ){
if( !in[i] && vis[i] ) q.push( i );
}
while( !q.empty( ) ){
int u = q.front( );
q.pop( );
ans.push_back( u );
for( int i = 0 ; i < e[u].size( ) ; i++ ){
int v = e[u][i];
in[v]--;
if( !in[v] ) q.push( v );
}
}
}
int main(){
cin >> m >> n;
for( int i = 1 , u , v ; i <= m ; i++ ){
cin >> u >> v;
G[i].push_back( u ); G[i].push_back( v );
}
int sum = 0;
for(int i = 1 ; i <= m ; i++ ){
memset(used, 0, sizeof(used));
if( find( i ) ){
vis[i] = 1;
sum++;
}
}
cout << m-sum <<endl;
toposort( );
for( int i = 1 ; i <= m ; i++ ){
if( !vis[i] ) ans.push_back( i );
}
for( int i = 0 ; i < ans.size( ) - 1 ; i++ ){
cout << ans[i] <<endl;
}
cout << ans[ans.size( )-1];
AK USACO
}