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.*;
import java.math.BigInteger;
import java.util.*;



public class Main {

	 static class FastReader 
	    { 
	        final private int BUFFER_SIZE = 1 << 16; 
	        private DataInputStream din; 
	        private byte[] buffer; 
	        private int bufferPointer, bytesRead; 
	  
	        public FastReader() 
	        { 
	            din = new DataInputStream(System.in); 
	            buffer = new byte[BUFFER_SIZE]; 
	            bufferPointer = bytesRead = 0; 
	        } 
	  
	        public FastReader(String file_name) throws IOException 
	        { 
	            din = new DataInputStream(new FileInputStream(file_name)); 
	            buffer = new byte[BUFFER_SIZE]; 
	            bufferPointer = bytesRead = 0; 
	        } 
	  
	        public String readLine() throws IOException 
	        { 
	            byte[] buf = new byte[64]; // line length 
	            int cnt = 0, c; 
	            while ((c = read()) != -1) 
	            { 
	                if (c == '\n') 
	                    break; 
	                buf[cnt++] = (byte) c; 
	            } 
	            return new String(buf, 0, cnt); 
	        } 
	  
	        public int nextInt() throws IOException 
	        { 
	            int ret = 0; 
	            byte c = read(); 
	            while (c <= ' ') 
	                c = read(); 
	            boolean neg = (c == '-'); 
	            if (neg) 
	                c = read(); 
	            do
	            { 
	                ret = ret * 10 + c - '0'; 
	            }  while ((c = read()) >= '0' && c <= '9'); 
	  
	            if (neg) 
	                return -ret; 
	            return ret; 
	        } 
	  
	        public long nextLong() throws IOException 
	        { 
	            long ret = 0; 
	            byte c = read(); 
	            while (c <= ' ') 
	                c = read(); 
	            boolean neg = (c == '-'); 
	            if (neg) 
	                c = read(); 
	            do { 
	                ret = ret * 10 + c - '0'; 
	            } 
	            while ((c = read()) >= '0' && c <= '9'); 
	            if (neg) 
	                return -ret; 
	            return ret; 
	        } 
	  
	        public double nextDouble() throws IOException 
	        { 
	            double ret = 0, div = 1; 
	            byte c = read(); 
	            while (c <= ' ') 
	                c = read(); 
	            boolean neg = (c == '-'); 
	            if (neg) 
	                c = read(); 
	  
	            do { 
	                ret = ret * 10 + c - '0'; 
	            } 
	            while ((c = read()) >= '0' && c <= '9'); 
	  
	            if (c == '.') 
	            { 
	                while ((c = read()) >= '0' && c <= '9') 
	                { 
	                    ret += (c - '0') / (div *= 10); 
	                } 
	            } 
	  
	            if (neg) 
	                return -ret; 
	            return ret; 
	        } 
	  
	        private void fillBuffer() throws IOException 
	        { 
	            bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE); 
	            if (bytesRead == -1) 
	                buffer[0] = -1; 
	        } 
	  
	        private byte read() throws IOException 
	        { 
	            if (bufferPointer == bytesRead) 
	                fillBuffer(); 
	            return buffer[bufferPointer++]; 
	        } 
	  
	        public void close() throws IOException 
	        { 
	            if (din == null) 
	                return; 
	            din.close(); 
	        } 
	    } 
	
		public static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
	 
		public static long mod = 998244353;
		public static long[] fac;
		public static int N = (int) 1e5;
		public static long[] dp;
		public static List<Integer>[] edges;
		public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FastReader sc = new FastReader();
		
		     int n = sc.nextInt();
		     int m = sc.nextInt();
		     int k = sc.nextInt();
		     List<Integer>[] edges = new ArrayList[n+1];
		     for(int i=0;i<=n;++i) edges[i] = new ArrayList<>();
		     int deg = 0;
		     for(int i=1;i<=m;++i) {
		    	 int u = sc.nextInt();
		    	 int v = sc.nextInt();
		    	 if(u == 1 || v == 1) ++deg;
		    	 edges[u].add(v);
		    	 edges[v].add(u);
		     }
		     if(n-deg-1 < k) out.println("impossible");
		     else {
		     DSU dsu = new DSU(n+1);
		     // to enhance
		     for(int i=1;i<=n;++i) Collections.sort(edges[i]);
		     
		     TreeSet<Integer> allComp = new TreeSet<>(); //contain one element from each comp
		     
		     for(int i=2;i<=n;++i) {
		    	 Map<Integer,Integer> map = new HashMap<>();
		    	 
		    	 for(int node : edges[i]) {
		    		 if(node == 1) continue;
		    		 /*
		    		  * till now comp. are made from nodes 
		    		  * less than i so there is no use of 
		    		  * node having value greater than i
		    		  */
		    		 if(node >= i) break;
		    		 int root = dsu.findRoot(node);
		    		 /*
		    		  * storing the number of node present in some white comp
		    		  * but connected to i with a black edge
		    		  */
		    		 map.put(root,map.getOrDefault(root,0)+1);
		    	 }
		    	 
		    	 List<Integer> list = new ArrayList<>();
		    	 
		    	 for(int node : allComp) {
		    		 int root = dsu.findRoot(node);
		    		 /*
		    		  * iterating over all comps 
		    		  * if we find any comp having at least one node 
		    		  * which are connected to i by a white edge
		    		  * then we can merge i to that comp
		    		  */
		    		 if(dsu.size[root] > map.getOrDefault(root,0)) {
		    			 dsu.unite(i, root);
		    			 list.add(node);
		    		 }
		    	 }
		    	 /*
		    	  * as now i is merged into diff comp
		    	  * so we delete the elements of that comp
		    	  * and insert i in place of them 
		    	  */
		    	 for(int x : list) allComp.remove(x);
		    	 allComp.add(i);
		     }
		     
		     if(allComp.size() <= k && valid(allComp,dsu,edges)) {
		    	 out.print("possible");
		     }else out.print("impossible");
		     }
		   
	        
	        
		out.close();
		}
		
		
		
		private static boolean valid(TreeSet<Integer> allComp, DSU dsu, List<Integer>[] edges) {
			// TODO Auto-generated method stub
			
			 Map<Integer,Integer> map = new HashMap<>();
	    	 
	    	 for(int node : edges[1]) {
	    		 int root = dsu.findRoot(node);
	    		 map.put(root,map.getOrDefault(root,0)+1);
	    	 }
	    	 
	    	 for(int node : allComp) {
	    		 int root = dsu.findRoot(node);
	    		 if(dsu.size[root] <= map.getOrDefault(root,0)) {
	    			 return false;
	    		 }
	    	 }
			return true;
		}



		static class DSU {
	        int n;
	        int[] parent, size;

	        public DSU(int v) {
	            n = v;
	            parent = new int[n];
	            size = new int[n];
	            for(int i = 0; i < n; i++) {
	                parent[i] = i;
	                size[i] = 1;
	            }
	        }

	        public int findRoot(int curr) {
	            if(curr == parent[curr]) return curr;
	            return parent[curr] = findRoot(parent[curr]);
	        }

	        public boolean unite(int a, int b) {
	            int rootA = findRoot(a);
	            int rootB = findRoot(b);
	            if(rootA == rootB) return true;
	            if(size[rootA] > size[rootB]) {
	                parent[rootB] = rootA;
	                size[rootA] += size[rootB];
	            }
	            else {
	                parent[rootA] = rootB;
	                size[rootB] += size[rootA];
	            }
	            return false;
	        }

}
}