https://vjudge.net/problem/UVA-10000
#include<iostream>
#include<cstring>
using namespace std;
const int N=105;
int g[N][N];
int main(){
int n,z=1;
while(~scanf("%d",&n),n){
int s;
scanf("%d",&s);
memset(g,-1,sizeof(g));
int a,b;
while(scanf("%d%d",&a,&b),a||b)
g[a][b]=1;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(g[i][k]!=-1&&g[k][j]!=-1&&(g[i][k]+g[k][j]>g[i][j]))
g[i][j]=g[i][k]+g[k][j];
int len=0;
int d;
for(int i=1;i<=n;i++)
if(g[s][i]>len){
len=g[s][i];d=i;
}
printf("Case %d: The longest path from %d has length %d, finishing at %d.\n\n",z++,s,len,d);
}
}