#include<bits/stdc++.h>
using namespace std;
vector<int> g[50000],gr[50000];
vector<pair<int,int> > groups;
vector<int> List[100],Listr[100];
void dfs(int p,int i,unordered_map<int,bool>& m){
    List[i].push_back(p);
    m[p]=true;
    for(int j=0;j<g[p].size();j++){
        if(!m[g[p][j]]) dfs(g[p][j],i,m);
    }
}
void dfsr(int p,int i,unordered_map<int,bool>& m){
    Listr[i].push_back(p);
    m[p]=true;
    for(int j=0;j<gr[p].size();j++){
        if(!m[gr[p][j]]) dfsr(gr[p][j],i,m);
    }
}
vector<int> Merge(vector<int> a,vector<int> b){
    int m1=0,m2=0;
    vector<int> v;
    while(m1<a.size() && m2<b.size()){
        int mm1=m1,mm2=m2;
        if(a[mm1]==b[mm2]){
            v.push_back(a[mm1]);
            m1++;
            m2++;
        }
        else{
            if(a[mm1]<b[mm2]){
                m1++;
            }
            else{
                m2++;
            }
        }

    }
    return v;
}
int main(){
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=0;i<m;i++){
        int x,y;
        cin>>x>>y;
        g[x].push_back(y);
        gr[y].push_back(x);
    }
    for(int i=0;i<k;i++){
        pair<int,int> p;
        cin>>p.first>>p.second;
        groups.push_back(p);
        unordered_map<int,bool> mp,mpr;
        dfs(p.first,i,mp);
        dfsr(p.second,i,mpr);
    }
    for(int i=0;i<k;i++){
        sort(List[i].begin(),List[i].end());
        sort(Listr[i].begin(),Listr[i].end());
        /*for(int j=0;j<List[i].size();j++){
            cout<<List[i][j]<<" ";
        }
        cout<<"\n";
        for(int j=0;j<Listr[i].size();j++){
            cout<<Listr[i][j]<<" ";
        }
        cout<<"\n";*/
        List[i]=Merge(List[i],Listr[i]);
    }
    vector<int> meet=List[0];
    for(int i=1;i<k;i++){
        meet=Merge(meet,List[i]);
    }
    cout<<meet.size()<<"\n";
    for(int i=0;i<meet.size();i++){
        cout<<meet[i]<<" ";
    }
}
