#include <bits/stdc++.h>
using namespace std;
bool cmp(const pair<int, int> &a, const pair<int, int> &b) {
  return ((a.first * 1LL * b.second - b.first * 1LL * a.second) < 0);
}
struct cmpiii {
  bool operator()(const pair<pair<int, int>, int> &a,
                  const pair<pair<int, int>, int> &b) const {
    if (a.first.first * 1LL * b.first.second ==
        b.first.first * a.first.second) {
      return (a.second < b.second);
    } else {
      return cmp(a.first, b.first);
    }
  }
};
const int nmax = 1e5 + 10;
vector<bool> fort;
vector<bool> mark;
vector<int> g[nmax];
vector<pair<int, int> > frac;
multiset<pair<pair<int, int>, int>, cmpiii> q;
vector<pair<pair<int, int>, int> > ans;
inline void dfs(const int u) {
  assert(mark[u] == false);
  mark[u] = true;
  int numer = 0;
  for (int i = 0; i < (int)g[u].size(); ++i) {
    int v = g[u][i];
    if (not fort[v]) numer++;
    if (not mark[v]) dfs(v);
  }
  frac[u] = make_pair(numer, (int)g[u].size());
}
void dfs_runner(const int n) {
  mark.assign(n, false);
  frac.assign(n, {0, 0});
  for (int i = 0; i < n; ++i) {
    if (not mark[i]) dfs(i);
  }
  for (int i = 0; i < n; ++i) assert(mark[i]);
}
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  fort.assign(n, false);
  for (int i = 0; i < k; ++i) {
    int x;
    scanf("%d", &x);
    x--;
    fort[x] = true;
  }
  for (int i = 0; i < m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--, y--;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  dfs_runner(n);
  for (int i = 0; i < n; ++i) {
    if (not fort[i]) {
      q.insert(make_pair(frac[i], i));
    }
  }
  while (not q.empty()) {
    ans.push_back(*q.begin());
    int u = q.begin()->second;
    assert(q.begin()->first == frac[u]);
    assert(mark[u] == true);
    q.erase(q.begin());
    mark[u] = false;
    for (int i = 0; i < (int)g[u].size(); ++i) {
      int v = g[u][i];
      if (not fort[v] and mark[v]) {
        auto iii = *q.find(make_pair(frac[v], v));
        assert(iii.first == frac[v] and iii.second == v);
        q.erase(q.find(make_pair(frac[v], v)));
        frac[v].first--;
        q.insert(make_pair(frac[v], v));
      }
    }
  }
  int idx = 0;
  for (int i = 0; i < (int)ans.size(); ++i) {
    if (cmp(ans[idx].first, ans[i].first)) idx = i;
  }
  printf("%d\n", (int)ans.size() - idx);
  for (int i = idx; i < (int)ans.size(); ++i) {
    printf("%d ", ans[i].second + 1);
  }
  return 0;
}
