#define N 11
void main()
{ int i,j;
struct team{int win;
int loss;
int score;
int sign;
};
int n,m,k,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{ if(n==0&&m==0) break;
struct team tea[N]={{0,0,0,0},{0,0,0,1},{0,0,0,2},
{0,0,0,3},{0,0,0,4},{0,0,0,5},
{0,0,0,6},{0,0,0,7},{0,0,0,8},
{0,0,0,9},{0,0,0,10}};
struct team t;
while(m--)
{ scanf("%d%d%d",&a,&b,&c);
if(c==1)
{ tea[a].score=3+tea[a].score; //算總分
tea[b].score=0+tea[b].score;
tea[a].win=1+tea[a].win;
tea[b].loss=1+tea[b].loss;
}
if(c==-1)
{ tea[a].score=-1+tea[a].score; //妳說
tea[b].score=3+tea[b].score;
tea[a].loss=1+tea[a].loss;
tea[b].win=1+tea[b].win;
}
if(c==0)
{ tea[a].score=1+tea[a].score;
tea[b].score=1+tea[b].score;
}
}
// for(i=1;i<=n;i++) 此處代表每個隊的得分,勝的場數,敗的場數
// printf("%d %d %d %d\n",i,tea[i].score,tea[i].win,tea[i].loss);
k=n;
for(j=1;j<n;j++,k--)
for(i=1;i<k;i++)
{ if(tea[i+1].score<tea[i].score) { t=tea[i]; //積分高的隊排後面。
tea[i]=tea[i+1];
tea[i+1]=t;
}
else if(tea[i].score==tea[i].score){ if(tea[i].win>tea[i+1].win) { t=tea[i];//積分壹樣的隊勝場數多的排後面
tea[i]=tea[i+1];
tea[i+1]=t;
}
else if(tea[i].win==tea[i+1].win) {if(tea[i].loss<tea[i+1].loss) {t=tea[i]; //積分壹樣且勝場數壹樣的隊負場數少的排後面
tea[i]=tea[i+1];
tea[i+1]=t;
}
else if(tea[i].loss==tea[i+1].loss) {if(tea[i].sign<tea[i+1].sign) {t=tea[i];//若還不能分出先後,編號小的排後面。
tea[i]=tea[i+1];
tea[i+1]=t;
}
}
}
}
}
for(i=n;i>1;i--) //輸出打印
printf("%d %d ",tea[i].sign,tea[i].score);
printf("%d %d",tea[i].sign,tea[i].score);
printf("\n");
}
}