Sunake is in the form of a polygonal line consisting of n vertices (without self-intersection). First, Sunake-kun's i-th vertex is at (xi, yi). You can move continuously by translating or rotating, but you cannot deform (change the length of the polygonal line or the angle between the two line segments). y = 0 is the wall, and there is a small hole at (0, 0). Determine if you can move through this hole so that the whole thing meets y <0.

Constraints

* 2 ≤ n ≤ 1000
* 0 ≤ xi ≤ 109
* 1 ≤ yi ≤ 109
* Lines do not have self-intersections
* None of the three points are on the same straight line
* (xi, yi) ≠ (xi + 1, yi + 1)
* All inputs are integers

Input


n
x1 y1
.. ..
xn yn


Output

Output "Possible" if you can move through the hole, and "Impossible" if you can't.

Examples

Input

4
0 1
1 1
1 2
2 2


Output

Possible


Input

11
63 106
87 143
102 132
115 169
74 145
41 177
56 130
28 141
19 124
0 156
22 183


Output

Impossible
#include<deque>
#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
#include<set>
#include<cmath>
#include<tuple>
#include<string>
#include<chrono>
#include<functional>
#include<iterator>
#include<random>
#include<unordered_set>
#include<array>
#include<map>
#include<iomanip>
#include<assert.h>
#include<list>
#include<bitset>
#include<stack>
#include<memory>
#include<numeric>
using namespace std;
using namespace std::chrono;
typedef long long int llint;
typedef long double lldo;
#define mp make_pair
#define mt make_tuple
#define pub push_back
#define puf push_front
#define pob pop_back
#define pof pop_front
#define fir first
#define sec second
#define res resize
#define ins insert
#define era erase
/*cout<<fixed<<setprecision(20);cin.tie(0);ios::sync_with_stdio(false);*/
const int mod=998244353 ;
const llint big=2.19e15+1;
const long double pai=3.141592653589793238462643383279502884197;
const long double eps=1e-10;
template <class T,class U>bool mineq(T& a,U b){if(a>b){a=b;return true;}return false;}
template <class T,class U>bool maxeq(T& a,U b){if(a<b){a=b;return true;}return false;}
llint gcd(llint a,llint b){if(a%b==0){return b;}else return gcd(b,a%b);}
llint lcm(llint a,llint b){if(a==0){return b;}return a/gcd(a,b)*b;}
template<class T> void SO(T& ve){sort(ve.begin(),ve.end());}
template<class T> void REV(T& ve){reverse(ve.begin(),ve.end());}
template<class T>llint LBI(const vector<T>&ar,T in){return lower_bound(ar.begin(),ar.end(),in)-ar.begin();}
template<class T>llint UBI(const vector<T>&ar,T in){return upper_bound(ar.begin(),ar.end(),in)-ar.begin();}
bool in(double A,double B,double C){
	//angle in
	//角度がAとBの間かどうかを調べる
	if(A>B){swap(A,B);}
	return ((A<C&&C<B)==(B-A<pai));
}
double R(double X){return (X>0?X-pai:X+pai);}
int main(void){
	int n,i,j;cin>>n;
	
	//各点について考えるだけでok?
	vector<pair<double,double>>pot(n);
	for(i=0;i<n;i++){cin>>pot[i].fir>>pot[i].sec;}
	bool can=true;
	for(i=1;i<n-1;i++){
		double A=atan2(pot[i-1].fir-pot[i].fir,pot[i-1].sec-pot[i].sec);
		double B=atan2(pot[i+1].fir-pot[i].fir,pot[i+1].sec-pot[i].sec);
		//AとBの間がセーフ
		for(j=0;j<i;j++){
			double C=atan2(pot[j].fir-pot[i].fir,pot[j].sec-pot[i].sec);
			if(in(B,R(A),C)){can=false;break;}
			if(in(A,B,C)){A=C;}
			if(in(A,B,R(C))){B=R(C);}
		}
		for(j=i+1;j<n;j++){
			double C=atan2(pot[j].fir-pot[i].fir,pot[j].sec-pot[i].sec);
			if(in(A,R(B),C)){can=false;break;}
			if(in(A,B,C)){B=C;}
			if(in(A,B,R(C))){A=R(C);}
		}
	}
	cout<<(can?"P":"Imp")<<"ossible\n";
	return 0;
}

