#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;   }   