#include <bits/stdc++.h>
using namespace std;
template <class T>
bool checkMin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool checkMax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
const int INF = 1e9;
const int MN = 60 + 5;
int n, m, q;
int dist[MN][MN][MN];
int mem[MN][MN][1001];
int main() {
  scanf("%d %d %d", &n, &m, &q);
  for (int i = 0; i < (m); i++)
    for (int j = 0; j < (n); j++)
      for (int k = 0; k < (n); k++) scanf("%d", &dist[i][j][k]);
  memset(mem, 127, sizeof(mem));
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (n); j++) mem[i][j][0] = INF;
  for (int g = 0; g < (m); g++)
    for (int k = 0; k < (n); k++)
      for (int i = 0; i < (n); i++)
        for (int j = 0; j < (n); j++)
          checkMin(dist[g][i][j], dist[g][i][k] + dist[g][k][j]);
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (n); j++)
      for (int k = 0; k < (m); k++) checkMin(mem[i][j][0], dist[k][i][j]);
  for (int left = (1); left <= (1000); left++)
    for (int i = 0; i < (n); i++)
      for (int j = 0; j < (n); j++)
        for (int l = 0; l < (n); l++)
          checkMin(mem[i][j][left], mem[i][l][left - 1] + mem[l][j][0]);
  while (q--) {
    int s, t, k;
    scanf("%d %d %d", &s, &t, &k);
    printf("%d\n", mem[s - 1][t - 1][k]);
  }
}
