#include <bits/stdc++.h>
using namespace std;
const int N = 1E5 + 10;
const double eps = 1e-9;
int n, m, K;
int save[N], num[N], du[N];
short v[N], sel[N];
int scan() {
  int i = 0;
  scanf("%d", &i);
  return i;
}
queue<int> dui;
struct Point {
  Point() { next = NULL; }
  Point *next;
  int d;
  void push(int a) {
    Point *l = new Point;
    l->d = a;
    l->next = next;
    next = l;
  }
} point[N];
void update(int x, double mid) {
  if (!sel[x] && (1. * num[x] / du[x] + eps <= mid)) {
    sel[x] = 1;
    dui.push(x);
  }
}
int check(double mid) {
  int left = n - K;
  for (int i = 1; i <= n; i++) sel[i] = v[i], num[i] = save[i];
  for (int i = 1; i <= n; i++)
    if (!sel[i]) {
      update(i, mid);
    }
  while (!dui.empty()) {
    left--;
    int now = dui.front();
    dui.pop();
    for (Point *i = point[now].next; i; i = i->next) {
      num[i->d]--;
      update(i->d, mid);
    }
  }
  return left;
}
int main() {
  int i, j, a, b;
  n = scan();
  m = scan();
  K = scan();
  for (i = 1; i <= K; i++) v[scan()] = 1;
  for (i = 1; i <= m; i++) {
    a = scan();
    b = scan();
    du[a]++;
    du[b]++;
    if (!v[a] && !v[b]) {
      save[a]++, save[b]++;
    }
    point[a].push(b);
    point[b].push(a);
  }
  a = check(1. / 2);
  double l, r, last = 0;
  l = 0, r = 1;
  while (r - l > 1e-8) {
    double mid = (l + r) / 2;
    if ((a = check(mid)) > 0)
      l = mid, last = mid;
    else
      r = mid;
  }
  a = check(last);
  printf("%d\n", a);
  for (i = 1; i <= n; i++)
    if (!sel[i]) {
      printf("%d ", i);
    }
  return 0;
}
