#include <bits/stdc++.h>
using namespace std;
const long long MXN = 2e3 + 10;
const long long MX5 = 3e5 + 10;
const long long MX6 = 1e6 + 10;
const long long LOG = 20;
const long long INF = 1e15;
const double eps = 1e-9;
const long long MOD = 1e9 + 7;
long long power(long long a, long long b, long long md) {
  return (!b ? 1
             : (b & 1 ? a * power(a * a % md, b / 2, md) % md
                      : power(a * a % md, b / 2, md) % md));
}
long long bmm(long long a, long long b) {
  return (a % b == 0 ? b : bmm(b, a % b));
}
string base2(long long n) {
  string a = "";
  while (n >= 2) {
    a += (char)(n % 2 + '0');
    n /= 2;
  }
  a += (char)(n + '0');
  reverse((a).begin(), (a).end());
  return a;
}
long long n, m, k, d[MX5];
vector<long long> G[MX5];
set<long long> st;
bitset<MX5> mark;
void DFS(int u) {
  st.erase(u);
  mark[u] = 1;
  std::set<long long>::iterator itr = st.begin();
  while (itr != st.end()) {
    int V = *itr;
    auto JJ = lower_bound(G[u].begin(), G[u].end(), V);
    if (JJ == G[u].end() || *(JJ) != V) {
      DFS(V);
    }
    itr = st.upper_bound(V);
  }
  return;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> k;
  for (int i = 1; i <= n; i++) d[i] = n - 1;
  for (int i = 0; i < m; i++) {
    long long u, v;
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
    d[u]--, d[v]--;
  }
  if (m > n * (n - 1) / 2 - n + 1 || d[1] < k ||
      *min_element(d + 1, d + n + 1) == 0)
    return cout << "impossible" << '\n', 0;
  ;
  for (int i = 1; i <= n; i++) {
    st.insert(i);
    sort(G[i].begin(), G[i].end());
  }
  long long t = 0;
  for (int i = 1; i <= n; i++) {
    if (!mark[i]) {
      t++;
      DFS(i);
    }
  }
  if (t > 1) {
    return cout << "impossible" << '\n', 0;
    ;
  }
  st.clear();
  for (int i = 2; i <= n; i++) st.insert(i);
  t = 0;
  mark = 0;
  for (int i = 2; i <= n; i++) {
    if (!mark[i]) {
      t++;
      DFS(i);
    }
  }
  cout << (t > k ? "impossible" : "possible") << '\n';
  return 0;
}
