#include <stdio.h>

struct segment
{
  char *origin;
  int offset;
  int length;
};

int 
cmpSegment(struct segment *pSeg1, struct segment *pSeg2)
{
  char *p1, *p2;
  int n;

  p1 = pSeg1->origin + pSeg1->offset;
  p2 = pSeg2->origin + pSeg2->offset;
  n = (pSeg1->length < pSeg2->length) ? pSeg1->length : pSeg2->length;
  while ((n > 0) && 
         (*p1 == *p2) &&
         (*p1 != '\0'))
  {
    ++p1;
    ++p2;
    --n;
  }
  if (n == 0 || (*p1 == '\0' && *p2 == '\0'))
  {
    return 0;
  }
  else
  {
    if (*p1 < *p2)
    {
      return -1;
    }
    else
    {
      return 1;
    }
  }
}

void analyze(struct segment *pSegment);

int
analyze2(
    struct segment *pSegment,
    struct segment *pSeg1,
    struct segment *pSeg2,
    int subSegmentLength
    )
{
  int done;

  done = 0;
  for (pSeg2->offset = pSeg1->offset + pSeg1->length; 
       !done && pSeg2->offset + subSegmentLength <= pSegment->length;
       ++pSeg2->offset)
  {
    if (pSeg1->offset + pSeg1->length <= pSeg2->offset)
    {
      if (cmpSegment(pSeg1, pSeg2) == 0)
      {
        // found a segment!
        write(1, pSeg1->origin + pSeg1->offset, pSeg1->length);
        write(1, "\n", 1);
        analyze(pSeg1);
        done = 1;
      }
    }
  }
  return done;
}

int
analyze1(struct segment *pSegment, 
         struct segment *pSeg1, 
         struct segment *pSeg2,
         int subSegmentLength)
{
  int done;

  done = 0;
  for (pSeg1->offset = pSegment->offset; 
       !done && pSeg1->offset + subSegmentLength <= 
         pSegment->length - subSegmentLength; 
       ++pSeg1->offset)
  {
    done = analyze2(pSegment, pSeg1, pSeg2, subSegmentLength);
  }
  return done;
}

void
analyze(struct segment *pSegment)
{
  int subSegmentLength;
  struct segment seg1, seg2;
  int done = 0;

  seg1.origin = pSegment->origin;
  seg2.origin = pSegment->origin;
  // find the largest subsegment
  for (subSegmentLength = pSegment->length - 1;
       !done && subSegmentLength > 1;
       --subSegmentLength)
  {
    seg1.length = subSegmentLength;
    seg2.length = subSegmentLength;
    done = analyze1(pSegment, &seg1, &seg2, subSegmentLength);
  }
}

int main(void)
{
  char buffer[256];
  struct segment root;

  root.length = read(0, buffer, sizeof(buffer));
  root.origin = buffer;
  root.offset = 0;
  if (buffer[root.length-1] == '\n')
  {
    --root.length;
  }
  analyze(&root);
  return 0;
}

