#include <bits/stdc++.h>
using namespace std;
int n, m, k;
bool fort[100007];
vector<int> v[100007];
struct tuhla {
  int vertex;
  double val;
};
double f[100007];
bool used[100007];
double bestval;
int id;
bool operator<(struct tuhla p1, struct tuhla p2) { return (p1.val > p2.val); }
priority_queue<struct tuhla> q;
void calc() {
  int i, j;
  for (i = 1; i <= n; i++) {
    if (fort[i] == true) {
      used[i] = true;
    } else {
      used[i] = false;
    }
  }
  for (i = 1; i <= n; i++) {
    if (fort[i] == true) {
      continue;
    }
    int sz = v[i].size();
    double br = 0.00000;
    for (j = 0; j < sz; j++) {
      if (fort[v[i][j]] == false) {
        br += 1.000000;
      }
    }
    f[i] = (br / sz);
    struct tuhla u;
    u.vertex = i;
    u.val = f[i];
    q.push(u);
  }
  bestval = -1.00000000;
  id = -1;
  int tot = 0;
  while (q.empty() == false) {
    struct tuhla cur = q.top();
    q.pop();
    if (fort[cur.vertex] == true || used[cur.vertex] == true) {
      continue;
    }
    if (cur.val > f[cur.vertex] + 0.0000001) {
      continue;
    }
    if (cur.val < f[cur.vertex] - 0.0000001) {
      continue;
    }
    if (bestval < cur.val) {
      bestval = cur.val;
      id = tot;
    }
    tot++;
    used[cur.vertex] = true;
    int sz = v[cur.vertex].size();
    for (i = 0; i < sz; i++) {
      if (used[v[cur.vertex][i]] == false) {
        struct tuhla u;
        f[v[cur.vertex][i]] =
            f[v[cur.vertex][i]] - (1.00000 / (v[v[cur.vertex][i]].size()));
        u.vertex = v[cur.vertex][i];
        u.val = f[v[cur.vertex][i]];
        q.push(u);
      }
    }
  }
}
void recreate(int br) {
  int i, j;
  for (i = 1; i <= n; i++) {
    if (fort[i] == true) {
      used[i] = true;
    } else {
      used[i] = false;
    }
  }
  for (i = 1; i <= n; i++) {
    int sz = v[i].size();
    double br = 0.00000;
    for (j = 0; j < sz; j++) {
      if (fort[v[i][j]] == false) {
        br += 1.000000;
      }
    }
    f[i] = (br / sz);
    struct tuhla u;
    u.vertex = i;
    u.val = f[i];
    q.push(u);
  }
  int tot = 0;
  while (q.empty() == false) {
    struct tuhla cur = q.top();
    q.pop();
    if (fort[cur.vertex] == true || used[cur.vertex] == true) {
      continue;
    }
    if (cur.val > f[cur.vertex] + 0.0000001) {
      continue;
    }
    if (cur.val < f[cur.vertex] - 0.0000001) {
      continue;
    }
    if (br == 0) {
      break;
    }
    br--;
    used[cur.vertex] = true;
    int sz = v[cur.vertex].size();
    for (i = 0; i < sz; i++) {
      if (used[v[cur.vertex][i]] == false) {
        struct tuhla u;
        f[v[cur.vertex][i]] =
            f[v[cur.vertex][i]] - (1.00000 / (v[v[cur.vertex][i]].size()));
        u.vertex = v[cur.vertex][i];
        u.val = f[v[cur.vertex][i]];
        q.push(u);
      }
    }
  }
}
void input() {
  scanf("%d%d%d", &n, &m, &k);
  int i;
  for (i = 1; i <= k; i++) {
    int x;
    scanf("%d", &x);
    fort[x] = true;
  }
  for (i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
}
void solve() {
  calc();
  recreate(id);
  vector<int> ret;
  int i;
  for (i = 1; i <= n; i++) {
    if (used[i] == false) {
      ret.push_back(i);
    }
  }
  int sz = ret.size();
  printf("%d\n", sz);
  for (i = 0; i < sz; i++) {
    printf("%d", ret[i]);
    if (i == sz - 1) {
      printf("\n");
    } else {
      printf(" ");
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  input();
  solve();
  return 0;
}
