A tree is a connected undirected graph consisting of n vertices and n - 1 edges. Vertices are numbered 1 through n.

Limak is a little polar bear. He once had a tree with n vertices but he lost it. He still remembers something about the lost tree though.

You are given m pairs of vertices (a1, b1), (a2, b2), ..., (am, bm). Limak remembers that for each i there was no edge between ai and bi. He also remembers that vertex 1 was incident to exactly k edges (its degree was equal to k).

Is it possible that Limak remembers everything correctly? Check whether there exists a tree satisfying the given conditions.

Input

The first line of the input contains three integers n, m and k (<image>) — the number of vertices in Limak's tree, the number of forbidden pairs of vertices, and the degree of vertex 1, respectively.

The i-th of next m lines contains two distinct integers ai and bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — the i-th pair that is forbidden. It's guaranteed that each pair of vertices will appear at most once in the input.

Output

Print "possible" (without quotes) if there exists at least one tree satisfying the given conditions. Otherwise, print "impossible" (without quotes).

Examples

Input

5 4 2
1 2
2 3
4 2
4 1


Output

possible


Input

6 5 3
1 2
1 3
1 4
1 5
1 6


Output

impossible

Note

In the first sample, there are n = 5 vertices. The degree of vertex 1 should be k = 2. All conditions are satisfied for a tree with edges 1 - 5, 5 - 2, 1 - 3 and 3 - 4.

In the second sample, Limak remembers that none of the following edges existed: 1 - 2, 1 - 3, 1 - 4, 1 - 5 and 1 - 6. Hence, vertex 1 couldn't be connected to any other vertex and it implies that there is no suitable tree.
import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.util.ArrayList;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 *
 * @author shu_mj @ http://shu-mj.com
 */
public class Main {
    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        Scanner in = new Scanner(inputStream);
        PrintWriter out = new PrintWriter(outputStream);
        TaskE solver = new TaskE();
        solver.solve(1, in, out);
        out.close();
    }

    static class TaskE {
        Scanner in;
        PrintWriter out;

        public void solve(int testNumber, Scanner in, PrintWriter out) {
            this.in = in;
            this.out = out;
            run();
        }

        void run() {
            int n = in.nextInt();
            int m = in.nextInt();
            int k = in.nextInt();
            List<Integer>[] G = new List[n];
            for (int i = 0; i < G.length; i++) {
                G[i] = new ArrayList<>();
                G[i].add(n);
            }
            for (int i = 0; i < m; i++) {
                int u = in.nextInt() - 1;
                int v = in.nextInt() - 1;
                G[u].add(v);
                G[v].add(u);
            }
            int[][] g = new int[n][];
            for (int i = 0; i < n; i++) {
                int[] is = Algo.unBox(G[i].toArray(new Integer[G[i].size()]));
                Arrays.sort(is);
                g[i] = Algo.unique(is);
            }
            UnionFindSet uf = new UnionFindSet(n);

            for (int i = 1; i < n; i++) {
                int begin = 1;
                for (int end : g[i]) {
                    int step = Math.max(1, (end - begin) / 10);
                    for (int j = begin; j < end; j += step) uf.union(i, j);
                    begin = end + 1;
                }
            }
            int[] size = new int[n];
            for (int i = 0; i < n; i++) size[uf.find(i)]++;
            int begin = 1;
            boolean[] vis = new boolean[n];
            int all = 0;
            int cnt = 0;
            for (int end : g[0]) {
                for (int i = begin; i < end; i++) {
                    int f = uf.find(i);
                    if (!vis[f]) {
                        vis[f] = true;
                        all += size[f];
                        cnt++;
                    }
                }
                begin = end + 1;
            }
//        Algo.debug(cnt, all);
            if (cnt <= k && g[0].length + k <= n && all == n - 1) {
                out.println("possible");
            } else {
                out.println("impossible");
            }
        }

    }

    static class Algo {
        public static int[] unique(int[] is) {
            return unique(is, 0, is.length);
        }

        public static int[] unique(int[] is, int b, int e) {
            if (b == e)
                return new int[0];
            int count = 1;
            for (int i = b + 1; i < e; i++) {
                if (is[i] != is[i - 1])
                    count++;
            }
            int[] res = new int[count];
            res[0] = is[b];
            int id = 1;
            for (int i = b + 1; i < e; i++) {
                if (is[i] != is[i - 1])
                    res[id++] = is[i];
            }
            return res;
        }

        public static int[] unBox(Integer[] Is) {
            int n = Is.length;
            int[] is = new int[n];
            for (int i = 0; i < n; i++) {
                is[i] = Is[i];
            }
            return is;
        }

    }

    static class UnionFindSet {
        public int[] pre;

        public UnionFindSet(int n) {
            pre = new int[n];
            for (int i = 0; i < n; i++) pre[i] = i;
        }

        public int find(int x) {
            if (pre[x] != x) pre[x] = find(pre[x]);
            return pre[x];
        }

        public void union(int x, int y) {
            pre[find(x)] = find(y);
        }

    }

    static class Scanner {
        BufferedReader br;
        StringTokenizer st;

        public Scanner(InputStream in) {
            br = new BufferedReader(new InputStreamReader(in));
            eat("");
        }

        private void eat(String s) {
            st = new StringTokenizer(s);
        }

        public String nextLine() {
            try {
                return br.readLine();
            } catch (IOException e) {
                return null;
            }
        }

        public boolean hasNext() {
            while (!st.hasMoreTokens()) {
                String s = nextLine();
                if (s == null)
                    return false;
                eat(s);
            }
            return true;
        }

        public String next() {
            hasNext();
            return st.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

    }
}

