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.util.*;
public class bearandforgottentree2{
	static Set<Integer> g[];
	static int n,m,k;
	static boolean[] visited;
	static Set<Integer> rem;
	//static HashSet<pair> forb;
 	public static void main(String[] args) throws Exception
	{
		InputReader in=new InputReader(System.in);
		PrintWriter pw=new PrintWriter(System.out);
		n=in.nextInt();
		//visited=new boolean[n];
		rem=new TreeSet<Integer>();
		//forb=new HashSet<pair>();
		g=new HashSet[n];
		for(int i=0;i<n;i++)
		{
			g[i]=new HashSet<Integer>();
		}
		for(int i=1;i<n;i++)
		{
			rem.add(i);
		}
		m=in.nextInt();
		k=in.nextInt();
		int cc=n-1;
		for(int i=0;i<m;i++)
		{
			int u=in.nextInt()-1;
			int v=in.nextInt()-1;
			pair temp=new pair(u,v);
			if(u==0 || v==0)
			{
				cc--;
			}
			g[u].add(v);
			g[v].add(u);
		//	g[u].add(v);
			//g[v].add(u);
			
		}
		if(cc<k)
		{
			System.out.println("impossible");
			System.exit(0);
		}
		int com=0;
		for(int i=1;i<n;i++)
		{
			if(rem.contains(i) && !g[0].contains(i))
			{
				com++;
				rem.remove(i);
				dfs(i);
			}
		}
		if(rem.size()>0)
		{
			pw.println("impossible");
		}
		else
		{
			int w=cc;
		
			if(k>=com && w>=k)
			{
				pw.println("possible");
			}
			else
			{
				pw.println("impossible");
			}
		}
		
		
		pw.close();
	}
 	/*public static boolean isok(int x,int y)
 	{
 		pair temp=new pair(x,y);
 		if(forb.contains(temp))
 		{
 			return false;
 		}
 		return true;
 	}*/
 	static class pair implements Comparable<pair>
 	{
 		int x, y;
 		public pair(int a,int b)
 		{
 			this.x=Math.min(a,b);
 			this.y=Math.max(a, b);
 		}
 		public  int compareTo(pair p1)
 		{
 			if(this.x!=p1.x)
 			{
 			return Integer.compare(this.x, p1.x);
 			}
 			return Integer.compare(this.y, p1.y);
 		}
 		public boolean equals(Object o)
 		{
 			if(this==o)
 			{
 				return true;
 			}
 			if(o==null || o.getClass()!=this.getClass())
 			{
 				return false;
 			}
 			pair temp=(pair)(o);
 			if(this.x==temp.x && this.y==temp.y)
 			{
 				return true;
 			}
 			return false;
 			
 		}
 		public int hashCode()
 		{
 			int a=Integer.hashCode(x);
 			return 31*a+Integer.hashCode(y);
 		}
 		
 	}
 	public static void dfs(int i)
 	{
 		//rem.remove(i);
 		ArrayList<Integer> ar=new ArrayList<Integer>();
 		for(int k:rem)
 		{
 			if(!g[i].contains(k))
 			{
 				ar.add(k);
 			}
 		}
 		for(int k:ar)
 		{
 		rem.remove(k);
 		}
 		for(int k:ar)
 		{
 			dfs(k);
 		}
 	}
	
	
	
	
	
	
	
	
	 static class InputReader {

		private InputStream stream;
		private byte[] buf = new byte[8192];
		private int curChar;
		private int snumChars;
		private SpaceCharFilter filter;

		public InputReader(InputStream stream) {
			this.stream = stream;
		}

		public int snext() {
			if (snumChars == -1)
				throw new InputMismatchException();
			if (curChar >= snumChars) {
				curChar = 0;
				try {
					snumChars = stream.read(buf);
				} catch (IOException e) {
					throw new InputMismatchException();
				}
				if (snumChars <= 0)
					return -1;
			}
			return buf[curChar++];
		}

		public int nextInt() {
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = snext();
			}

			int res = 0;

			do {
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			} while (!isSpaceChar(c));

			return res * sgn;
		}
		
		public long nextLong() {
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = snext();
			}

			long res = 0;

			do {
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			} while (!isSpaceChar(c));

			return res * sgn;
		}
		
		public String readString() {
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			StringBuilder res = new StringBuilder();
			do {
				res.appendCodePoint(c);
				c = snext();
			} while (!isSpaceChar(c));
			return res.toString();
		}

		public boolean isSpaceChar(int c) {
			if (filter != null)
				return filter.isSpaceChar(c);
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}

		public interface SpaceCharFilter {
			public boolean isSpaceChar(int ch);
		}
	}

}
