#include <bits/stdc++.h>
using namespace std;
double EPS = 1e-9;
int INF = 1000000005;
long long INFF = 1000000000000000005LL;
double PI = acos(-1);
int dirx[8] = {-1, 0, 0, 1, -1, -1, 1, 1};
int diry[8] = {0, 1, -1, 0, -1, 1, -1, 1};
inline string IntToString(long long a) {
  char x[100];
  sprintf(x, "%lld", a);
  string s = x;
  return s;
}
inline long long StringToInt(string a) {
  char x[100];
  long long res;
  strcpy(x, a.c_str());
  sscanf(x, "%lld", &res);
  return res;
}
inline string GetString(void) {
  char x[1000005];
  scanf("%s", x);
  string s = x;
  return s;
}
inline string uppercase(string s) {
  int n = (int)s.size();
  for (int(i) = (0); (i) < (n); ++(i))
    if (s[i] >= 'a' && s[i] <= 'z') s[i] = s[i] - 'a' + 'A';
  return s;
}
inline string lowercase(string s) {
  int n = (int)s.size();
  for (int(i) = (0); (i) < (n); ++(i))
    if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a';
  return s;
}
inline void OPEN(string s) {
  freopen((s + ".in").c_str(), "r", stdin);
  freopen((s + ".out").c_str(), "w", stdout);
}
int n, m, k;
vector<int> adj[100005];
bool blok[100005];
int a, b, c;
vector<int> risan;
bool ambil[100005];
int hitung[100005];
double haha[100005];
void bisa(double cek, vector<int> &v) {
  priority_queue<pair<double, int>, vector<pair<double, int>>,
                 greater<pair<double, int>>>
      pq;
  for (int(i) = (0); (i) < (n); ++(i))
    if (!blok[i]) ambil[i] = 1;
  for (int(i) = (0); (i) < (n); ++(i))
    if (ambil[i]) {
      hitung[i] = 0;
      for (int(j) = (0); (j) < ((int)adj[i].size()); ++(j))
        if (ambil[adj[i][j]]) ++hitung[i];
      haha[i] = (double)hitung[i] / (double)(int)adj[i].size();
      pq.push(make_pair(haha[i], i));
    }
  while (!pq.empty()) {
    double cost = pq.top().first;
    int now = pq.top().second;
    pq.pop();
    if (haha[now] != cost) continue;
    if (cost >= cek) break;
    ambil[now] = 0;
    for (int(i) = (0); (i) < ((int)adj[now].size()); ++(i))
      if (ambil[adj[now][i]]) {
        int x = adj[now][i];
        --hitung[x];
        haha[x] = (double)hitung[x] / (double)(int)adj[x].size();
        pq.push(make_pair(haha[x], x));
      }
  }
  for (int(i) = (0); (i) < (n); ++(i))
    if (ambil[i]) v.push_back(i);
}
int main() {
  scanf("%d %d %d", &n, &m, &k);
  for (int(i) = (0); (i) < (k); ++(i)) {
    scanf("%d", &a);
    blok[--a] = 1;
  }
  while (m--) {
    scanf("%d %d", &a, &b);
    --a;
    --b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  double L = -1;
  double R = 1;
  for (int(i) = (1); (i) <= (60); ++(i)) {
    double M = (L + R) / 2;
    vector<int> temp;
    bisa(M, temp);
    if ((int)temp.size() > 0) {
      L = M;
      risan = temp;
    } else
      R = M;
  }
  printf("%d\n", (int)risan.size());
  for (int(i) = (0); (i) < ((int)risan.size()); ++(i))
    printf("%d ", risan[i] + 1);
  puts("");
  return 0;
}
