#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

LL sqr(LL x){ return x * x; }
int sgn(LL x){ return x>0?1:x<0?-1:0; }

struct point{
    LL x, y;
    point(LL x, LL y):x(x), y(y) {}
    point() {}
    bool operator == (const point & a) const{ return sgn(x - a.x) == 0 && sgn(y - a.y) == 0; }
    bool operator != (const point & a) const{ return sgn(x - a.x) != 0 || sgn(y - a.y) != 0; }
    bool operator < (const point & a) const{ return sgn(x - a.x) < 0 || sgn(x - a.x) == 0 && sgn(y - a.y) < 0; }
    point operator + (const point & a) const{ return point(x + a.x, y + a.y); }
    point operator - (const point & a) const{ return point(x - a.x, y - a.y); }
    point operator * (const double & a) const{ return point(x * a, y * a); }
    point operator / (const double & a) const{ return point(x / a, y / a); }
    double operator * (const point & a) const{ return x * a.y - y * a.x; }//xmult
    double operator ^ (const point & a) const{ return x * a.x + y * a.y; }//dmult
    double length() const{ return sqrt(sqr(x) + sqr(y)); }
};

inline bool dotsInline(const point & p1, const point & p2, const point & p3){
    return (p1 - p3) * (p2 - p3) == 0;
}

int decideSide(const point & p1, const point & p2, const point & l1, const point & l2){
    return sgn((l1 - l2) * (p1 - l2)) * sgn((l1 - l2) * (p2 - l2));
}

bool dotOnlineIn(const point & p, const point & l1, const point & l2){
	return ((p - l2) * (l1 - l2) == 0 && (l1.x - p.x) * (l2.x - p.x) ==0 && (l1.y - p.y) * (l2.y - p.y) == 0);
}

bool intersectIn(const point & u1, const point & u2, const point & v1, const point & v2){
	if (!dotsInline(u1, u2, v1) || !dotsInline(u1, u2, v2)){
		return (decideSide(u1, u2, v1, v2) != 1 && decideSide(v1, v2, u1, u2) != 1);
    }
	else{
		return (dotOnlineIn(u1, v1, v2) || dotOnlineIn(u2, v1, v2) || dotOnlineIn(v1, u1, u2) || dotOnlineIn(v2, u1, u2));
	}
//	return 1;
}

int w,p;
int xx[1100],yy[1100],x[1100],y[1100];
int s[1100];
vector<int> e[1100];

bool check(int i,int j)
{
	point a(xx[s[i]],yy[s[i]]),b(x[i],y[i]),c(xx[s[j]],yy[s[j]]),d(x[j],y[j]);
	if (s[i]==s[j]) return 1;
	else return !intersectIn(a,b,c,d);
}

bool bfs()
{
	queue<int> q;
	int vis[1100];
	memset(vis,-1,sizeof(vis));
	while(!q.empty()) q.pop();
	for (int i=0;i<p;i++){
		if (!(~vis[i])) vis[i]=1;
		q.push(i);
		while(!q.empty())
		{
			int u=q.front();
			q.pop();
			for (int i=0;i<e[u].size();i++){
				int v=e[u][i];
				if (~vis[v])
					if (!(vis[u]^vis[v])){
	//					cout << u << "!!!" << v << endl;
						return 0;
					}
					else;
				else{
					vis[v]=!vis[u];
					q.push(v);
				}
			}
		}
	}
	return 1;
}

int main()
{
	while(scanf("%d%d",&w,&p)!=EOF)
	{
		for (int i=1;i<=w;i++) scanf("%d%d",xx+i,yy+i);
		for (int i=0;i<p;i++) scanf("%d%d%d",s+i,x+i,y+i);
		for (int i=0;i<p;i++) e[i].clear();
		for (int i=0;i<p;i++)
			for (int j=0;j<i;j++)
			if (!check(i,j)){
				e[i].push_back(j);
				e[j].push_back(i);
			}
/*		for (int i=0;i<p;i++){
			printf("%d : ",i);
			for (int j=0;j<e[i].size();j++) printf("%d ",e[i][j]);
			puts("");
		}*/
		if (bfs()) puts("possible");
		else puts("impossible");
	}
}










