Problem: A TV show called "Guess a number!" is gathering popularity. The whole Berland, the old and the young, are watching the show.

The rules are simple. The host thinks of an integer y and the participants guess it by asking questions to the host. There are four types of acceptable questions:

  * Is it true that y is strictly larger than number x? 
  * Is it true that y is strictly smaller than number x? 
  * Is it true that y is larger than or equal to number x? 
  * Is it true that y is smaller than or equal to number x? 



On each question the host answers truthfully, "yes" or "no".

Given the sequence of questions and answers, find any integer value of y that meets the criteria of all answers. If there isn't such value, print "Impossible".

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 10000) — the number of questions (and answers). Next n lines each contain one question and one answer to it. The format of each line is like that: "sign x answer", where the sign is:

  * ">" (for the first type queries), 
  * "<" (for the second type queries), 
  * ">=" (for the third type queries), 
  * "<=" (for the fourth type queries). 



All values of x are integer and meet the inequation  - 109 ≤ x ≤ 109. The answer is an English letter "Y" (for "yes") or "N" (for "no").

Consequtive elements in lines are separated by a single space.

Output

Print any of such integers y, that the answers to all the queries are correct. The printed number y must meet the inequation  - 2·109 ≤ y ≤ 2·109. If there are many answers, print any of them. If such value doesn't exist, print word "Impossible" (without the quotes).

Examples

Input

4
&gt;= 1 Y
&lt; 3 N
&lt;= -3 N
&gt; 55 N


Output

17


Input

2
&gt; 100 Y
&lt; -100 Y


Output

Impossible

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;

public class AiseHi {
	static class FastReader
	{
	BufferedReader br;
	StringTokenizer st;

	public FastReader()
	{
	br = new BufferedReader(new
	InputStreamReader(System.in));
	}

	String next()
	{
	while (st == null || !st.hasMoreElements())
	{
	try
	{
	st = new StringTokenizer(br.readLine());
	}
	catch (IOException e)
	{
	e.printStackTrace();
	}
	}
	return st.nextToken();
	}

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

	long nextLong()
	{
	return Long.parseLong(next());
	}

	double nextDouble()
	{
	return Double.parseDouble(next());
	}

	String nextLine()
	{
	String str = "";
	try
	{
	str = br.readLine();
	}
	catch (IOException e)
	{
	e.printStackTrace();
	}
	return str;
	}
	}
	static int m = (int)(1e9+9);
	static long mod(long x) {
		return ((x%m + m)%m);
	}
	static long add(long a,long b) {
		return mod(mod(a)+mod(b));
	}
	static long mul(long a,long b) {
		return mod(mod(a) * mod(b));
	}
	
	public static void main (String[] args) {
		FastReader sc = new FastReader();
		int t = 1;
		t = sc.nextInt();
		int min = Integer.MIN_VALUE+1000000000;
		int max = Integer.MAX_VALUE-1000000000;
		outer : while(t-->0) {
			String s = sc.nextLine();
//			sc.nextLine();
			int i = 0;
			String op = "";
			while(s.charAt(i)!=' ') {
				op = op+s.charAt(i);
				i++;
			}
//			System.out.println(op+" "+i);
			i++;
			int val = 0;
			String no = "";
			while(s.charAt(i)!=' ') {
				no = no+s.charAt(i);
				i++;
			}
			val = Integer.parseInt(no);
//			System.out.println(val);
			i+=1;
//			System.out.println(i);
			if(s.charAt(i)=='N') {
//				System.out.println("hi");
				if(op.equals(">=")) {
					op = "/<";
				}
				if(op.equals("<=")) op = "/>";
				if(op.equals("<")) {
					op = ">=";
				}
				if(op.equals(">")) op = "<=";
			}
			else {
				if(op.equals(">")) {
					op = "/>";
				}
				if(op.equals("<")) {
					op = "/<";
				}
			}
//			System.out.println(op);
			if(op.equals(">=")) min = Math.max(min, val);
			if(op.equals("/>")) min = Math.max(min, val+1);
			if(op.equals("<=")) max = Math.min(max, val);
			if(op.equals("/<")) max = Math.min(max, val-1);
		}
//		System.out.println(max+" "+min);
		if(max>=min ) System.out.println(min);
		else System.out.println("Impossible");
	}
	static long lstbt(long val) {
		long msk = val & (val-1);
		return (long) (Math.log(val^msk)/Math.log(2));
	}
	private static long sqrt(long x) {
		long l = 1,h = x;
		long ans = 0;
		while(l<=h) {
			long mid = (l+(h-l)/2);
			if(mid>x/mid) h = mid-1;
			else {
				ans = mid;
				l = mid+1;
			}
		}
		return ans;
	}
	static boolean prime[] = new boolean[10000001];
	static void sieve() {
		prime[0] = true;
		prime[1] = true;
		int max = 10000000;
		for(int i=2;i*i<=max;i++) {
			if(!prime[i]) {
				for(int j=i*i;j<=max;j+=i)
					prime[j] = true;
			}
		}
	}
	static String reverse(String x) {
		StringBuilder input1 = new StringBuilder();
		
        input1.append(x);
        
        input1 = input1.reverse();
        
        return input1.toString();
	}
	static int gcd(int val, int g) {
		if(g==0) return val;
		
		return gcd(g,val%g);
	}
}
class pair{
	long a;
	long b;
	pair(long a,long b){
		this.a = a;
		this.b = b;
	}
}