#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:67108864")
using namespace std;
vector<int> g[200000];
bool def[200000], del[200000];
int all[200000], good[200000], _good[200000];
int n, m, k;
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 0; i < k; i++) {
    int t;
    scanf("%d", &t);
    def[t - 1] = true;
  }
  for (int i = 0; i < m; i++) {
    int from, to;
    scanf("%d%d", &from, &to);
    from--, to--;
    g[from].push_back(to);
    g[to].push_back(from);
    if (def[from]) good[to]--;
    if (def[to]) good[from]--;
    all[from]++, all[to]++;
  }
  memcpy(_good, good, sizeof good);
  priority_queue<pair<double, int>, vector<pair<double, int>>,
                 greater<pair<double, int>>>
      q;
  for (int i = 0; i < n; i++) {
    good[i] += all[i];
    if (!def[i]) q.push(make_pair((double)good[i] / all[i], i));
  }
  double best = -1;
  while (!q.empty()) {
    int v = q.top().second;
    double ratio = q.top().first;
    q.pop();
    if (del[v]) continue;
    del[v] = true;
    best = max(best, ratio);
    for (auto it = g[v].begin(); it != g[v].end(); it++) {
      if (def[*it] || del[*it]) continue;
      good[*it]--;
      q.push(make_pair((double)good[*it] / all[*it], *it));
    }
  }
  memset(del, false, sizeof del);
  memcpy(good, _good, sizeof _good);
  for (int i = 0; i < n; i++) {
    good[i] += all[i];
    if (!def[i]) q.push(make_pair((double)good[i] / all[i], i));
  }
  double cur = -1;
  while (!q.empty()) {
    int v = q.top().second;
    double ratio = q.top().first;
    q.pop();
    if (del[v]) continue;
    cur = max(cur, ratio);
    if (cur == best) break;
    del[v] = true;
    for (auto it = g[v].begin(); it != g[v].end(); it++) {
      if (def[*it] || del[*it]) continue;
      good[*it]--;
      q.push(make_pair((double)good[*it] / all[*it], *it));
    }
  }
  int r = 0;
  for (int i = 0; i < n; i++)
    if (!(del[i] || def[i])) r++;
  printf("%d\n", r);
  for (int i = 0; i < n; i++)
    if (!(del[i] || def[i])) printf("%d ", i + 1);
  return 0;
}
