#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Używamy long long dla bezpieczeństwa przy sumowaniu czasów przejazdu
const long long INF = 1e18;
struct Punkt {
long long x, y;
};
struct Ulica {
int od, cel; // Zmieniono 'do' na 'cel'
long long t;
long long dx, dy;
};
// Macierz odległości umieszczona globalnie
long long dist[505][505];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m, p;
if (!(cin >> n >> m >> p)) return 0;
vector<Punkt> punkty(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> punkty[i].x >> punkty[i].y;
}
vector<Ulica> ulice(m + 1);
for (int i = 1; i <= m; ++i) {
// Zmieniono 'do' na 'cel' w cin i obliczeniach
cin >> ulice[i].od >> ulice[i].cel >> ulice[i].t;
ulice[i].dx = punkty[ulice[i].cel].x - punkty[ulice[i].od].x;
ulice[i].dy = punkty[ulice[i].cel].y - punkty[ulice[i].od].y;
}
vector<int> przystanki(p);
for (int i = 0; i < p; ++i) {
cin >> przystanki[i];
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= m; ++j) {
dist[i][j] = (i == j) ? 0 : INF;
// Inicjalizacja: 0 jeśli ta sama ulica, INF w innych przypadkach
}
}
// Budowanie grafu ulic
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= m; ++j) {
// Sprawdzamy połączenie: koniec ulicy i musi być początkiem ulicy j
if (ulice[i].cel == ulice[j].od) {
// Iloczyn skalarny dla kąta <= 90 stopni
if (ulice[i].dx * ulice[j].dx + ulice[i].dy * ulice[j].dy >= 0) {
dist[i][j] = ulice[i].t + ulice[j].t;
}
}
}
}
// Floyd-Warshall
for (int k = 1; k <= m; ++k) {
for (int i = 1; i <= m; ++i) {
if (dist[i][k] == INF) continue;
for (int j = 1; j <= m; ++j) {
if (dist[k][j] < INF) {
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}
long long laczny_czas = 0;
bool mozliwe = true;
vector<long long> wyniki;
for (int i = 0; i < p - 1; ++i) {
int u1 = przystanki[i];
int u2 = przystanki[i + 1];
// Obsługa przypadku, gdy stoimy w miejscu (ten sam przystanek/ulica)
if (u1 == u2) {
wyniki.push_back(laczny_czas);
continue;
}
if (dist[u1][u2] >= INF) {
mozliwe = false;
break;
}
laczny_czas += dist[u1][u2];
wyniki.push_back(laczny_czas);
}
if (!mozliwe) {
cout << "NIE" << endl;
} else {
for (long long w : wyniki) {
cout << w << "\n";
}
}
return 0;
}