/* Jozef Tvarozek - Tolls */
#include <stdio.h>

#define MAXN 500002

typedef struct
{
  short cost[4];
  int next[4];
} CITY;

CITY c[MAXN];
int n,sum,sofar;
int need_min,need_max;
char res[MAXN],dead[MAXN];
int depth = 0;

int push(int vert)
{
  int i,j,inc=0;
  for (i = 0; i < 4; i++)
    if ( c[vert].next[i] != -1 )
      if (res[vert]==res[c[vert].next[i]])
        inc += c[vert].cost[i];
      else
        inc -= c[vert].cost[i];
  if ( inc>0 )
  {
    res[vert] = !res[vert];
    sofar += inc;
    dead[vert] = 0;
    for (i = 0; i < 4; i++)
    if ( c[vert].next[i] != -1 )
    {
      j = c[vert].next[i];
      if ( j != -1 )
        if ( dead[j] == 0 )
        {
          depth++;
          if ( depth < 50 )
            push(j);
          depth--;
        }
    }
  }
  else
    dead[vert] = 1;
  return inc;
}
int rise(void)
{
  int i,found=0;
  for (i = 0; i < n; i++)
    if ( dead[i] == 0 )
      if ( push(i) )
        found = 1;
  return found;
}

int main(void)
{
  FILE *fin,*fout;
  int i,j,k,l,p,m;
  double d = 0.0;

  fin = fopen("tol.in","rt");
  fout = fopen("tol.out","wt");

  fscanf(fin,"%d %d",&n,&m);
  for (i = 0; i < n; i++)
    c[i].next[0] = c[i].next[1] = c[i].next[2] = c[i].next[3] = -1;
  for (i = 0; i < m; i++)
  {
    fscanf(fin,"%d %d %d",&j,&k,&l);
    j--; k--; sum += l;
    for (p = 0; c[j].next[p] != -1 && p < 4; p++);
    if ( p == 4 )
    {
      printf("vela hran! %d\n",j+1);
      exit(0);
    }
    c[j].next[p] = k; c[j].cost[p] = (short)l;
    for (p = 0; c[k].next[p] != -1 && p < 4; p++);
    if ( p == 4 )
    {
      printf("vela hran! %d\n",k+1);
      exit(0);
    }
    c[k].next[p] = j; c[k].cost[p] = (short)l;
  }
/*  printf("hrany [suma=%d]:",sum);
  for( i = 0; i < n; i++)
  {
    printf("\n%d: ",i+1);
    for (p = 0; p < 4; p++)
      if ( c[i].next[p] != -1 )
        printf("%d[%d],",c[i].next[p]+1,c[i].cost[p]);
  }
*/
  need_min = (int)((double)sum*0.45);
  while ( (double)need_min/(double)sum < 0.45 )
    need_min++;
  need_max = (int)((double)sum*0.60);
  while ( (double)need_max/(double)sum < 0.60 )
    need_max++;
//  printf("\nmin = %d, max = %d\n",need_min,need_max);

//  printf("prvy push\n");
  for (i = 0; i < n; i++)
  {
    push(i);
    dead[i] = 0;
  }
  
//  printf("riseup\n");
//  memset(&dead,0,sizeof(dead));
  while ( sofar < need_max )
  {
    if ( rise() == 0 )
    {
      if ( sofar < need_min )
        memset(&dead,0,sizeof(dead));
      else
        break;
    }
  }
      
  for (j = 0, i = 0; i < n; i++)
    j += res[i] == 0;
  fprintf(fout,"%d %d %d\n",j,n-j,sofar);
  for (i = 0; i < n; i++)
    if ( res[i] == 0 )
      fprintf(fout,"%d\n",i+1);
  for (i = 0; i < n; i++)
    if ( res[i] == 1 )
      fprintf(fout,"%d\n",i+1);
  return 0;
}
