/*
碰巧看到,WA很多次,看过别人代码A的
题意:
有向图
当输入0 x 标记x为可以通过的点
当输入1 a b是求出两点之间最短路,必须是过标记过的点
后记:
注意区别有向图和无向图
*/
#include <stdio.h>
#include <iostream>
using namespace std;
#define Max 999999999
#define N 305
int edges[N][N];
int visit[N],n;
void init()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++){
edges[i][j]=Max;
}
edges[i][i]=0;
visit[i]=0;
}
}
void floyd(int k,int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(edges[i][k]+edges[k][j]<edges[i][j])
edges[i][j]=edges[i][k]+edges[k][j];
}
}
int main()
{
int m,q,i,j,cas=1,a,b,c;
while(scanf("%d %d %d",&n,&m,&q)!=EOF&&(n||m||q))
{
if(cas>1) printf("\n");
init();
for(i=0;i<m;i++)
{
scanf("%d %d %d",&a,&b,&c);
if(c<edges[a][b]){
edges[a][b]=c;
}
}
printf("Case %d:\n",cas++);
for(i=0;i<q;i++)
{
scanf("%d",&a);
if(a)
{
scanf("%d %d",&b,&c);
if(!visit[b]||!visit[c])
{
printf("ERROR! At path %d to %d\n",b,c);
}
else
{
if(edges[b][c]==Max)
printf("No such path\n");
else
printf("%d\n",edges[b][c]);
}
}
else
{
scanf("%d",&b);
if(!visit[b])
{
visit[b]=1;
floyd(b,n);
}
else
printf("ERROR! At point %d\n",b);
}
}
}
return 0;
}