#include <bits/stdc++.h>
using namespace std;
const int mxN = 300005;
struct DSU {
  int connectedComponents;
  vector<int> p;
  vector<int> size;
  void build(int n) {
    connectedComponents = n - 2;
    p = vector<int>(n);
    size = vector<int>(n);
    for (int i = 0; i < n; i++) {
      p[i] = i;
      size[i] = 1;
    }
  }
  int get(int x) {
    if (x != p[x]) {
      p[x] = get(p[x]);
    }
    return p[x];
  }
  bool unite(int a, int b) {
    a = get(a);
    b = get(b);
    if (a == b) return false;
    if (size[a] > size[b]) swap(a, b);
    p[a] = b;
    size[b] += size[a];
    connectedComponents--;
    return true;
  }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, m, k;
  cin >> n >> m >> k;
  DSU dsu;
  dsu.build(n + 1);
  set<int> unvisited;
  vector<bool> visited(n + 1, false);
  vector<set<int>> forbidden(n + 1);
  for (int i = 2; i <= n; i++) unvisited.insert(unvisited.end(), i);
  int possFirst = n - 1;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    if (a == 1 || b == 1) possFirst--;
    forbidden[a].insert(b);
    forbidden[b].insert(a);
  }
  if (possFirst < k) {
    cout << "impossible";
    return 0;
  }
  while (!unvisited.empty()) {
    int val = *unvisited.begin();
    unvisited.erase(unvisited.begin());
    visited[val] = true;
    for (int i = 2; i <= n; i++) {
      if (forbidden[val].find(i) != forbidden[val].end()) continue;
      if (!visited[i]) {
        unvisited.erase(i);
        visited[i] = true;
      }
      dsu.unite(val, i);
    }
  }
  if (dsu.connectedComponents > k) {
    cout << "impossible";
    return 0;
  }
  for (int i = 2; i <= n; i++) {
    if (forbidden[1].find(i) == forbidden[1].end()) dsu.unite(1, i);
  }
  if (dsu.connectedComponents == 0) {
    cout << "possible";
  } else {
    cout << "impossible";
  }
}
