#include <iostream>
#include <set>
#include <vector>
#include <cassert>
using namespace std;

const int nmax = 1e5 + 10;

set<int> forts;
vector<int> g[nmax];
vector<bool> mark;
vector<pair<int, int> > frac;

bool cmp(const pair<int, int> &a, const pair<int, int> &b) {
    return (a.first * 1LL * b.second - a.second * 1LL * b.first < 0);
}

void dfs(const int u) {
    mark[u] = true;
    for(int i = 0; i < g[u].size(); ++i) {
        int v = g[u][i];
        if(not mark[v]) dfs(v);
        if(forts.count(v) == 0) frac[u].first++;
        frac[u].second++;
    }
}

void dfs_runner(int n) {
    mark.assign(n, false);
    frac.reserve(n);
    for(int i = 0; i < n; ++i) {
        if(not mark[i]) {
            dfs(i);
        }
    }
}

struct cmpii {
    bool operator()(const pair<pair<int, int>, int> &a, const pair<pair<int, int>, int> &b) const {
        return cmp(a.first, b.first);
    }
};

int main() {
    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    for(int i = 0; i < k; ++i) {
        int x; scanf("%d", &x);
        x--;
        forts.insert(x);
    }
    for(int i = 0; i < m; ++i) {
        int a, b; scanf("%d%d", &a, &b);
        a--; b--;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfs_runner(n);

    multiset<pair<pair<int, int>, int>, cmpii> q;
    vector<pair<pair<int, int>, int> > possibles;
    for(int i = 0; i < n; ++i) {
        if(forts.count(i) == 0) {
            q.insert(make_pair(frac[i], i));
        } else {
            mark[i] = false;
        }
    }
    while(not q.empty()) {
        auto iii = *q.begin(); q.erase(q.begin());
        possibles.push_back(iii);
        int u = iii.second;
        mark[u] = false;

        for(int i = 0; i < g[u].size(); ++i) {
            int v = g[u][i];
            if(mark[v]) {
                q.erase(q.find(make_pair(frac[v], v)));
                assert(frac[v].first >= 1);
                frac[v].first--;
                q.insert(make_pair(frac[v], v));
            }
        }
    }
    
    int minidx = 0;
    for(int i = 0; i < possibles.size(); ++i) {
        auto kkk = possibles[minidx];
        auto iii = possibles[i];
        if(cmp(kkk.first, iii.first)) minidx = i;
    }
    printf("%d\n", (int)(possibles.size()) - minidx);
    for(int i = minidx; i < possibles.size(); ++i) {
        printf("%d ", possibles[i].second + 1);
    }
    return 0;
}
