#include <iostream.h>
#include <fstream.h>


const MAX_COL = 110;
const MAX = 110;

// tasks for guys
char T[MAX][MAX+1]; // E[i][0] - # of vertices connected to i; E[i][k] - vertex
// connected to i

int N, M;  // N = left side, M = right side # of vertices

char C[MAX][MAX];  // guy to index in T

int maxCol = 0; // # of colours

void DoMe()
{


 // C[i][j] - color of edge from i to j != C[j][i]
 memset(C, 0, sizeof(C));

 while (1)
 {
   int A, B, v, w;
   int i, j;
   v = -1;

   // find an edge not yet coloured
   for (i=1; (i <= N) && (v == -1); i++)
    for (j=1; (j <= T[i][0]) && (v == -1); j++)
     if (C[i][ j ] == 0) {v = i; w = j;};

   if (v == -1) break;

   // **** v is a guy, w is an index into task *****

   // find colours AB such that vw misses AB

   int Vcol[MAX_COL+1];
   memset(Vcol, 0, sizeof(Vcol));

   for (j=1; j <= T[v][0]; j++)
    Vcol[ C[v][ j ] ] = 1;     // C[x][y] == 0 if not coloured

   for (j=1; j <= MAX_COL; j++)
    if (Vcol[j] == 0) {A = j; break;}

   int Wcol[MAX_COL+1];
   memset(Wcol, 0, sizeof(Wcol));

   // find all edges going into that task
   for (i=1; i <= N; i++)
    for (j=1; j <= T[i][0]; j++)
     if (T[i][j] == T[v][w])
      Wcol[ C[i][j] ] = 1;

   for (j=1; j <= MAX_COL; j++)
    if (Wcol[j] == 0) {B = j; break;}

   if (A > maxCol) maxCol = A;
   if (B > maxCol) maxCol = B;

   // do the alternating path

   char GVis[MAX];
   char TVis[MAX];
   memset(GVis, 0, sizeof(GVis));
   memset(TVis, 0, sizeof(TVis));

   GVis[v] = 1;

   while (1)
   {
    int i, j;
    for (i=1; i <= N; i++)
     if (GVis[i] == 1) break;

    if (i <= N)
    {

     GVis[i] = 2;

     for (j=1; j <= T[i][0]; j++)
      if ((C[ i ][ j ] == A || C[i][ j ] == B) && !TVis[ T[i][j] ])
       TVis[ T[i][j] ] = 1;
    }


    for (i=1; i <= M; i++)
     if (TVis[i] == 1) break;

    if (i > M) break;
    int x = i;

    TVis[i] = 2;

    // find all edges going into that task
    for (i=1; i <= N; i++)
     for (j=1; j <= T[i][0]; j++)
      if (T[i][j] == x && (C[i][j] == A || C[i][j] == B) && !GVis[i])
       GVis[i] = 1;


   }


   // interchange
   if (Vcol[B] != 0 && Wcol[A] != 0)
   {

    for (int i=1; i <= N; i++)
     if (GVis[i])
      for (int j=1; j <= T[i][0]; j++)
       if (TVis[ T[i][j] ]) // exchg. A&B
        if (C[i][ j ] == A)
         C[i][ j ] = B;
        else if (C[i][ j ] == B)
         C[i][ j ] = A;
   }

   // color
   memset(Vcol, 0, sizeof(Vcol));
   memset(Wcol, 0, sizeof(Wcol));
   for (j=1; j <= T[v][0]; j++)
    Vcol[ C[v][ j ] ] = 1;

   // find all edges going into that task
   for (i=1; i <= N; i++)
    for (j=1; j <= T[i][0]; j++)
     if (T[i][j] == T[v][w])
      Wcol[ C[ i ][j] ] = 1;

   if (Vcol[A] == 0 && Wcol[A] == 0)
    C[v][w] = A;
   else if (Vcol[B] == 0 && Wcol[B] == 0)
    C[v][w] = B;
   else
    cout << "SHIT" << endl;


 }

/*
   for (int i=1; i <= N; i++)
    for (int j=1; j <= E[i][0]; j++)
     cout << i << " " << E[i][j]-N << " = " << E[i][j] << " " << C[i][ E[i][j] ] << endl;
*/

}

void main()
{
 ifstream in;
 in.open("edge.in");
 ofstream out;
 out.open("edge.out");

 while (1)
 {
  in >> N >> M;
  if (N < 0) break;

  memset(T, 0, sizeof(T));

  // assume integers 1..N on left side, 1..M on the right
  while (1)
  {
    int x, y, times;

    in >> x >> y >> times;
    if (x < 0) break;

    for (int ii=0; ii < times; ii++)
    {
     T[x][0] ++;
     T[x][ T[x][0] ] = y;
    }

  }

  DoMe();

  out << maxCol << endl;


  for (int i=1; i <= maxCol; i++)
  {
   for (int j=1; j <= N; j++)
    for (int k=1; k <= T[j][0]; k++)
     if (C[j][ k ] == i)
      out << j << "(" << (int) T[j][k] << ")" << " ";
   out << endl;
  }

 }
 in.close();
 out.close();


}
Downloader failed!
Response object
006~ASP 0159~Buffering Off~Buffering must be on.