#include <bits/stdc++.h>
using namespace std;
template <typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p) {
  out << '(' << p.first << ", " << p.second << ')';
  return out;
}
template <typename T>
ostream& operator<<(ostream& out, vector<T> const& v) {
  int l = v.size();
  for (int i = 0; i < l - 1; i++) out << v[i] << ' ';
  if (l > 0) out << v[l - 1];
  return out;
}
void tr() { cout << endl; }
template <typename S, typename... Strings>
void tr(S x, const Strings&... rest) {
  cout << x << ' ';
  tr(rest...);
}
const int N = 300100;
int n, m, k;
set<pair<int, int> > s;
set<int> unvisited;
void good() {
  puts("possible");
  exit(0);
}
void bad() {
  puts("impossible");
  exit(0);
}
void dfs(int x) {
  vector<int> nxt;
  for (__typeof((unvisited).begin()) it = (unvisited).begin();
       it != (unvisited).end(); ++it) {
    if (s.count(make_pair(x, *it))) continue;
    nxt.push_back(*it);
  }
  for (__typeof((nxt).begin()) it = (nxt).begin(); it != (nxt).end(); ++it)
    unvisited.erase(*it);
  for (__typeof((nxt).begin()) it = (nxt).begin(); it != (nxt).end(); ++it) {
    dfs(*it);
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  int u, v, deg = 0;
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &u, &v);
    s.insert(make_pair(u, v));
    s.insert(make_pair(v, u));
    if (u == 1 or v == 1) deg++;
  }
  if (n - 1 - deg < k) bad();
  for (int i = 2; i <= n; i++) {
    unvisited.insert(i);
  }
  dfs(1);
  if (!unvisited.empty()) bad();
  for (int i = 2; i <= n; i++) {
    unvisited.insert(i);
  }
  int comp = 0;
  while (!unvisited.empty()) {
    comp++;
    int x = *unvisited.begin();
    unvisited.erase(x);
    dfs(x);
  }
  if (comp > k) bad();
  good();
  return 0;
}
