#include <bits/stdc++.h>
using namespace std;
#define TR(i,v)         for(__typeof((v).begin())i=(v).begin();i!=(v).end();++i)
#define DEBUG(x)        cout << #x << " = " << x << endl;
#define SIZE(p)         (int)(p).size()
#define MP(a, b)        make_pair((a), (b))
#define ALL(p)          (p).begin(), (p).end()
#define rep(i, n)       for(int (i)=0; (i)<(int)(n); ++(i))
#define REP(i, a, n)    for(int (i)=(a); (i)<(int)(n); ++(i))
#define FOR(i, a, b)    for(int (i)=(int)(a); (i)<=(int)(b); ++(i))
#define FORD(i, b, a)   for(int (i)=(int)(b); (i)>=(int)(a); --(i))
#define CLR(x, y)       memset((x), (y), sizeof((x)))
typedef long long LL;
typedef pair<int, int> pii;
const int inf = ~0U>>2;
const int maxn=155;
vector<pii> g[maxn];
int Dis[maxn][maxn][maxn];
struct Edge {
	int u,v,w;
	bool operator<(const Edge &rhs) const{
		return w<rhs.w;
	}
}E[3005];

int main(int argc, char const *argv[]) {
#ifndef ONLINE_JUDGE
    freopen("C.in", "r", stdin);
    // freopen("out", "w", stdout);
#endif
    // ios::sync_with_stdio(false);		cin.tie(0);
    int T;	scanf("%d",&T);
    while(T--) {
    	int n,m,Q;	scanf("%d%d%d", &n,&m,&Q);
    	FOR(i,1,n)	g[i].clear();
    	rep(i,m) {
    		int u,v,w;	scanf("%d%d%d",&u,&v,&w);
    		g[u].push_back(MP(v,w));	E[i]=(Edge){u,v,w};
    	}        
    	sort(E,E+m);
    	FOR(i,1,n)
    	FOR(j,1,n)
    	FOR(k,0,n)	Dis[i][j][k]=i==j?0:inf;
    	rep(i,m) {
    		int u=E[i].u,v=E[i].v,w=E[i].w;
    		FOR(i,1,n)
    		FOR(k,0,n-1)
    			Dis[i][v][k+1]=min(Dis[i][v][k+1],Dis[i][u][k]+w);
    	}
    	FOR(i,1,n)
    	FOR(j,1,n)    		
    	FOR(k,1,n)
    		Dis[i][j][k]=min(Dis[i][j][k],Dis[i][j][k-1]);
    	while(Q--) {
    		int u,v,k;	scanf("%d%d%d", &u,&v,&k);	k=min(k,n);
    		int res=Dis[u][v][k];    		    		
    		res=res==inf?-1:res;
    		printf("%d\n",res);
    	}
    }
    return 0;
}