#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N,M,K;
cin>>N>>M>>K;
vector<vector<int>>g(N+1),t(N+1);
vector<pair<int,int>>e;
for(int i=0;i<M;i++){
int a,b;
cin>>a>>b;
if(i<K){
t[a].push_back(b);
t[b].push_back(a);
e.emplace_back(a,b);
e.emplace_back(b,a);
}
else{
g[a].push_back(b);
g[b].push_back(a);
}
}
if(0){
start:
int TREE=1;
N=2+rand()%10,M=TREE?N-1:rand()%min(N*(N-1)/2,N*2),K=M==0?0:rand()%M;
struct DSU {
vector<int> v;
DSU(int n) : v(n + 1, -1) {
}
int find(int a) {
return v[a] < 0 ? a : v[a] = find(v[a]);
}
void unite(int a, int b) {
a = find(a);
b = find(b);
if (a == b) {
return;
}
if (v[a] > v[b]) {
swap(a, b);
}
v[a] += v[b];
v[b] = a;
}
};
DSU dsu(N+1);
g.clear();
g.resize(N+1);
t.clear();
t.resize(N+1);
e.clear();
set<pair<int,int>>s;
for(int i=0;i<M;i++){
int a,b;
do{
a=1+rand()%N,b=1+rand()%N;
}
while(a==b||s.count({a,b})||(TREE&&dsu.find(a)==dsu.find(b)));
s.insert({a,b});
s.insert({b,a});
dsu.unite(a,b);
if(i<K){
t[a].push_back(b);
t[b].push_back(a);
e.emplace_back(a,b);
e.emplace_back(b,a);
}
else{
g[a].push_back(b);
g[b].push_back(a);
}
}
}
vector<vector<pair<int,int>>>gg(N+1);
for(int i=1;i<=N;i++){
for(int j:g[i]){
gg[i].emplace_back(j,0);
}
for(int j:t[i]){
gg[i].emplace_back(j,1);
}
}
#define g gg
vector<int>v(N+1),w(N+1),u(N+1),z(N+1),p(N+1);
auto dfs=[&](auto self,int i)->void{
w[i]=i;
for(auto[j,b]:g[i]){
if(j==p[i]){
continue;
}
if(v[j]){
exit(2);
if(v[j]<v[w[i]]){
w[i]=j;
}
continue;
}
v[j]=v[i]+1;
p[j]=i;
self(self,j);
if(v[w[j]]<v[w[i]]){
w[i]=w[j];
}
if(b){
u[j]=1;
}
}
};
v[1]=1;
dfs(dfs,1);
auto dfs2=[&](auto self,int i,int b)->void{
z[i]|=b;
for(auto[j,x]:g[i]){
if(v[j]&&p[j]!=i){
continue;
}
v[j]=v[i]+1;
p[j]=i;
self(self,j,b|u[j]);
}
};
dfs2(dfs2,1,0);
#undef g
if(0){
int st=clock();
vector<int>ans;
for(int i=1;i<=N;i++){
if(z[i])ans.push_back(i);
}
vector<int>ans1;
{
vector<int>v(N+1),u(N+1);
auto bt=[&](auto self,int i,int b)->void{
if(clock()>st+CLOCKS_PER_SEC/10){
return;
}
if(v[i]){
return;
}
if(b){
u[i]=1;
}
v[i]=1;
for(int j:g[i]){
self(self,j,b);
}
for(int j:t[i]){
self(self,j,1);
}
v[i]=0;
};
bt(bt,1,0);
if(clock()>st+CLOCKS_PER_SEC/10){
cout<<"TIMEOUT"<<endl;
goto start;
}
for(int i=1;i<=N;i++){
if(u[i]){
ans1.push_back(i);
}
}
}
if(ans1.size()!=ans.size()){
cout<<"============= INPUT ============="<<endl;
cout<<N<<" "<<M<<" "<<K<<endl;
for(int i=1;i<=N;i++){
for(int j:t[i]){
if(j<i)continue;
cout<<i<<' '<<j<<' '<<endl;
}
}
for(int i=1;i<=N;i++){
for(int j:g[i]){
if(j<i)continue;
cout<<i<<' '<<j<<endl;
}
}
cout<<"============= NODES ============="<<endl;
for(int i=1;i<=N;i++){
cout<<setw(3)<<i<<" L "<<v[i]<<" D "<<w[i]<<" P "<<p[i]<<endl;
}
cout<<"============= EDGES ============="<<endl;
for(int i=1;i<=N;i++){
for(int j:g[i]){
if(j<i)continue;
cout<<i<<' '<<j<<' '<<0+(p[j]==i||p[i]==j?min(v[i],v[j]):0)<<endl;
}
for(int j:t[i]){
if(j<i)continue;
cout<<i<<' '<<j<<' '<<100+(p[j]==i||p[i]==j?min(v[i],v[j]):0)<<endl;
}
}
cout<<"============= GOT ============="<<endl;
cout<<ans.size()<<'\n';
for(int i:ans){
cout<<i<<' ';
}
cout<<'\n';
cout<<"============= EXP ============="<<endl;
cout<<ans1.size()<<'\n';
for(int i:ans1){
cout<<i<<' ';
}
cout<<'\n';
exit(1);
}
static int cc=0;
cout<<"OK "<<setw(9)<<cc++<<" "<<ans.size()<<endl;
goto start;
}
cout<<count(u.begin()+1,u.end(),1)<<'\n';
for(int i=1;i<=N;i++){
if(u[i]){
cout<<i<<' ';
}
}
cout<<'\n';
return 0;
}