#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=205;
const int EM=1005;
const int INF=100000000;
int out[maxn],in[maxn],degree[maxn],N,M,S;
int s,t,dist[maxn],Q[maxn],first[maxn],size;
struct Edge
{
int v,c,next;
}edge[EM*4];
void insert(int u,int v,int c)
{
edge[size].v=v;
edge[size].c=c;
edge[size].next=first[u];
first[u]=size++;
}
int dinic_bfs()
{
int head=0,tail=0;
memset(dist,0,sizeof(dist));
dist[s]=1; Q[tail++]=s;
while(head<tail)
{
int u=Q[head++],v;
for(int e=first[u];e!=-1;e=edge[e].next)
{
if(edge[e].c && !dist[v=edge[e].v])
{
dist[v]=dist[u]+1;
if(v==t) return 1;
Q[tail++]=v;
}
}
}
return 0;
}
int dinic_dfs(int u,int cap)
{
int ret=0,v;
if(u==t) return cap;
for(int e=first[u];e!=-1;e=edge[e].next)
{
if(edge[e].c && dist[v=edge[e].v]==dist[u]+1 && ret<cap)
{
int flow=dinic_dfs(v,min(cap-ret,edge[e].c));
if(flow>0)
{
edge[e].c-=flow;
edge[e^1].c+=flow;
ret+=flow;
}
}
}
if(!ret) dist[u]=-1;
return ret;
}
int dinic()
{
int ans=0,tmp;
while(dinic_bfs())
while(tmp=dinic_dfs(s,INF)) ans+=tmp;
return ans;
}
int slove()
{
s=0;t=M+1;
int tin=0,tout=0;
for(int i=1;i<=M;i++)
{
degree[i]=in[i]-out[i];
if(degree[i]%2) return 0;
else
{
if(degree[i]>0)
{
tout+=degree[i]/2;
insert(i,t,degree[i]/2);
insert(t,i,0);
}
else if(degree[i]<0)
{
tin-=degree[i]/2;
insert(s,i,-degree[i]/2);
insert(i,s,0);
}
}
}
if(tin!=tout) return 0;
if(dinic()==tin) return 1;
else return 0;
}
int main()
{
// freopen("test.txt","r",stdin);
scanf("%d",&N);
while(N--)
{
memset(first,-1,sizeof(first));size=0;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
scanf("%d%d",&M,&S);
for(int i=0;i<S;i++)
{
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
out[u]++;in[v]++;
if(!d)
{
insert(u,v,1);
insert(v,u,0);
}
}
if(slove()) printf("possible\n");
else printf("impossible\n");
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=205;
const int EM=1005;
const int INF=100000000;
int out[maxn],in[maxn],degree[maxn],N,M,S;
int s,t,dist[maxn],Q[maxn],first[maxn],size;
struct Edge
{
int v,c,next;
}edge[EM*4];
void insert(int u,int v,int c)
{
edge[size].v=v;
edge[size].c=c;
edge[size].next=first[u];
first[u]=size++;
}
int dinic_bfs()
{
int head=0,tail=0;
memset(dist,0,sizeof(dist));
dist[s]=1; Q[tail++]=s;
while(head<tail)
{
int u=Q[head++],v;
for(int e=first[u];e!=-1;e=edge[e].next)
{
if(edge[e].c && !dist[v=edge[e].v])
{
dist[v]=dist[u]+1;
if(v==t) return 1;
Q[tail++]=v;
}
}
}
return 0;
}
int dinic_dfs(int u,int cap)
{
int ret=0,v;
if(u==t) return cap;
for(int e=first[u];e!=-1;e=edge[e].next)
{
if(edge[e].c && dist[v=edge[e].v]==dist[u]+1 && ret<cap)
{
int flow=dinic_dfs(v,min(cap-ret,edge[e].c));
if(flow>0)
{
edge[e].c-=flow;
edge[e^1].c+=flow;
ret+=flow;
}
}
}
if(!ret) dist[u]=-1;
return ret;
}
int dinic()
{
int ans=0,tmp;
while(dinic_bfs())
while(tmp=dinic_dfs(s,INF)) ans+=tmp;
return ans;
}
int slove()
{
s=0;t=M+1;
int tin=0,tout=0;
for(int i=1;i<=M;i++)
{
degree[i]=in[i]-out[i];
if(degree[i]%2) return 0;
else
{
if(degree[i]>0)
{
tout+=degree[i]/2;
insert(i,t,degree[i]/2);
insert(t,i,0);
}
else if(degree[i]<0)
{
tin-=degree[i]/2;
insert(s,i,-degree[i]/2);
insert(i,s,0);
}
}
}
if(tin!=tout) return 0;
if(dinic()==tin) return 1;
else return 0;
}
int main()
{
// freopen("test.txt","r",stdin);
scanf("%d",&N);
while(N--)
{
memset(first,-1,sizeof(first));size=0;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
scanf("%d%d",&M,&S);
for(int i=0;i<S;i++)
{
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
out[u]++;in[v]++;
if(!d)
{
insert(u,v,1);
insert(v,u,0);
}
}
if(slove()) printf("possible\n");
else printf("impossible\n");
}
return 0;
}