#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<set>
using namespace std;
struct Node
{
double x,y;
} a[100005];
struct Edge
{
int x,y;
} e[600005];
int n,m,refr;
map< pair<int,int> , int> PA,Edges;
class cmp
{
public: inline bool operator()(const int &a,const int &b) const
{
return PA[make_pair(refr,a)]<PA[make_pair(refr,b)];
}
};
struct Nod
{
int u,deg;
Nod() {}
Nod(int uu,int ddeg) {u=uu;deg=ddeg;}
inline bool operator<(const Nod &other) const
{
return deg<other.deg;
}
};
multiset<Nod> S;
bool viz[600005];
int faces,face[600005];
int color[200005];
set<int> F[200005];
map<int,int> G[100005];
int start,in_set[200005];
void make_face(int a,int f)
{
face[a]=f;viz[a]=true;
G[e[a].x].erase(PA[make_pair(e[a].x,e[a].y)]);
if(e[a].y==start)
return;
map<int,int>::iterator it=G[e[a].y].upper_bound(PA[make_pair(e[a].y,e[a].x)]);
if(it==G[e[a].y].end())
it=G[e[a].y].begin();
make_face(Edges[make_pair(e[a].y,it->second)],f);
}
int degree[200005];
void colorare()
{
if(S.size()==1)
{
color[S.begin()->u]=1;
return;
}
int u=S.begin()->u;S.erase(S.find(Nod(u,degree[u])));
degree[u]=0;in_set[u]=0;
vector<int> v(1,u);
for(set<int>::iterator it=F[u].begin();it!=F[u].end();it++)
if(in_set[*it])
v.push_back(*it);
for(set<int>::iterator it=F[u].begin();it!=F[u].end();it++)
if(in_set[*it])
{
Nod p(*it,degree[*it]);
S.erase(S.find(p));
p.deg--;degree[*it]--;
S.insert(p);
}
colorare();
int f[7]={0,0,0,0,0,0,0};
for(set<int>::iterator it=F[u].begin();it!=F[u].end();it++)
f[color[*it]]=1;
for(int i=1;i<=6;i++)
if(!f[i])
{
color[u]=i;
return;
}
}
int main()
{
freopen("nowhere-zero.in","r",stdin);
freopen("nowhere-zero.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
double aux;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&e[i].x,&e[i].y);
e[2*m+1-i]=e[i];swap(e[2*m+1-i].x,e[2*m+1-i].y);
aux=100000000.0*atan2(a[e[i].y].y-a[e[i].x].y,a[e[i].y].x-a[e[i].x].x);
PA[make_pair(e[i].x,e[i].y)]=(int)aux;
aux=100000000.0*atan2(a[e[i].x].y-a[e[i].y].y,a[e[i].x].x-a[e[i].y].x);
PA[make_pair(e[i].y,e[i].x)]=(int)aux;
refr=e[i].x;G[e[i].x].insert(make_pair(PA[make_pair(e[i].x,e[i].y)],e[i].y));
refr=e[i].y;G[e[i].y].insert(make_pair(PA[make_pair(e[i].y,e[i].x)],e[i].x));
Edges[make_pair(e[i].x,e[i].y)]=i;
Edges[make_pair(e[i].y,e[i].x)]=2*m+1-i;
}
for(int i=1;i<=2*m;i++)
if(!viz[i])
{
start=e[i].x;
make_face(i,++faces);
}
for(int i=1;i<=m;i++)
if(face[i]!=face[2*m+1-i])
{
F[face[i]].insert(face[2*m+1-i]);
F[face[2*m+1-i]].insert(face[i]);
}
for(int i=1;i<=faces;i++)
{
degree[i]=(int)F[i].size();
S.insert(Nod(i,degree[i]));
in_set[i]=1;
}
colorare();
for(int i=1;i<=m;i++)
{
int cost=color[face[i]]-color[face[2*m+1-i]];
if(cost<0)
printf("%d %d %d\n",e[i].y,e[i].x,-cost);
else
printf("%d %d %d\n",e[i].x,e[i].y,cost);
}
return 0;
}