#include <bits/stdc++.h>
using namespace std;
typedef struct frac {
  long long p, q;
} frac;
const double eps = 1e-8;
int n;
int nb[100100];
vector<int> G[100100];
bool col[100100];
int cur[100100];
int onstk[100100];
inline bool operator<(frac a, frac b) { return a.p * b.q < b.p * a.q; }
inline bool operator==(frac a, frac b) { return a.p * b.q == b.p * a.q; }
inline bool operator>(frac a, frac b) { return a.p * b.q > b.p * a.q; }
inline bool operator>=(frac a, double b) {
  return ((double)a.p / (double)a.q) >= b;
}
inline bool operator!=(frac a, frac b) { return a.p * b.q != b.p * a.q; }
inline frac newfrac(long long a, long long b) {
  frac x;
  x.p = a;
  x.q = b;
  return x;
}
inline bool valid(double z, bool pr) {
  priority_queue<pair<frac, int>, vector<pair<frac, int> >,
                 greater<pair<frac, int> > >
      S;
  for (int i = (1); i <= (n); i++) {
    cur[i] = 0;
    onstk[i] = false;
  }
  for (int x = (1); x <= (n); x++) {
    if (col[x]) {
      for (int j = (0); j < (G[x].size()); j++) {
        int y = G[x][j];
        if (col[y]) {
          cur[x]++;
        }
      }
      S.push(make_pair(newfrac(cur[x], nb[x]), x));
      onstk[x] = true;
    }
  }
  bool ok = false;
  while (!S.empty()) {
    if (!onstk[S.top().second]) {
      S.pop();
      continue;
    }
    if (S.top().first >= z) {
      ok = true;
      break;
    } else {
      int x = S.top().second;
      S.pop();
      onstk[x] = false;
      for (int j = (0); j < (G[x].size()); j++) {
        int y = G[x][j];
        if (onstk[y]) {
          cur[y]--;
          S.push(make_pair(newfrac(cur[y], nb[y]), y));
        }
      }
    }
  }
  if (pr) {
    int cnt = 0;
    vector<int> V;
    for (int i = (1); i <= (n); i++) {
      if (onstk[i]) {
        cnt++;
        V.push_back(i);
      }
    }
    printf("%d\n", cnt);
    for (int i = (0); i < (V.size()); i++) {
      printf("%d", V[i]);
      if (i < V.size() - 1) {
        printf(" ");
      }
    }
    printf("\n");
  }
  return ok;
}
int main() {
  int m, k, x, y;
  scanf("%d%d%d", &n, &m, &k);
  for (int i = (1); i <= (n); i++) {
    nb[i] = 0;
    col[i] = true;
  }
  for (int i = (1); i <= (k); i++) {
    scanf("%d", &x);
    col[x] = false;
  }
  for (int i = (1); i <= (m); i++) {
    scanf("%d%d", &x, &y);
    nb[x]++;
    nb[y]++;
    if ((col[y]) and (col[x])) {
      G[x].push_back(y);
      G[y].push_back(x);
    }
  }
  double l = 0.0, r = 1.0;
  while ((r - l) > eps) {
    double mid = (l + r) / 2;
    if (valid(mid, false)) {
      l = mid;
    } else {
      r = mid;
    }
  }
  col[0] = valid(l, true);
  return 0;
}
