#include #define ll long long using namespace std; int N, M, G, D[1005], COST[1005][2005], Cities[1005]; struct Node{ int Sused, Weight; bool operator <(const Node &a) const{ return Weight > a.Weight; } }A; struct Child{ int idx, City, COSTS[2005]; }Children[1005]; vectorV[1005]; int FW[2005][2005], Oklenba[1005][1005]; bool SortCost(Child A, Child B) { if(A.COSTS[1] != B.COSTS[1])return A.COSTS[1] > B.COSTS[1]; return A.COSTS[1000] > B.COSTS[1000]; } void Input() { freopen("transport.in", "r", stdin); cin >> N >> M >> G; // cout << N << ' ' << M << ' ' << G << '\n'; for(int i = 1; i <= G; i++)Children[i].idx = i; for(int i = 1; i <= G; i++)scanf("%d", &Children[i].City); for(int i = 1; i <= N; i++) { for(int j = 1; j <= 2000; j++) { scanf("%d", &COST[i][j]); } } // cout << "ZIv\n"; for(int i = 1; i <= N; i++) Oklenba[i][i] = i; for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { FW[i][j] = 1e9; } } for(int i = 1; i <= M; i++) { // Node A; int x; cin >> x >> A.Sused >> A.Weight; // cout << "UNEOOVO\n" << x << ' ' << A.Sused << endl; FW[x][A.Sused] = A.Weight; Oklenba[x][A.Sused] = x; Oklenba[A.Sused][x] = A.Sused; FW[A.Sused][x] = A.Weight; // cout << "ZIVVVVV\n"; V[x].push_back(A); // cout << "ZIVVVV\n"; swap(x, A.Sused); V[x].push_back(A); } for(int i = 1; i <= N; i++) Oklenba[i][i] = i; // cout << "ZIVV\n"; for(int i = 1; i <= G; i++) { int x = Children[i].City; for(int j = 1; j <= 2000; j++) { Children[i].COSTS[j] = COST[x][j]; } } // cout << "ZIVV\n"; for(int k = 1; k <= N; k++){ for(int i = 1; i <= N; i++){ for(int j = 1; j <= N; j++){ if(FW[i][j] > FW[i][k] + FW[k][j]) FW[i][j] = FW[i][k] + FW[k][j], Oklenba[i][j] = Oklenba[k][j]; } } } for(int i = 1; i <= N; i++) Oklenba[i][i] = i; // cout << "ZIVVV\n"; // for(int i = 1; i <= N; i++) // { // for(int j = 1; j <= N; j++) // cout << FW[i][j] << ' '; // cout << endl; // } //// cout << "GOTOVFW\n"; // for(int i = 1; i <= N; i++) // { // for(int j = 1; j <= N; j++) // cout << Oklenba[i][j] << ' '; // cout << endl; // } } void JedanPoJedan() { freopen("transport.out", "w", stdout); // sort(Children + 1, Children + G + 1, SortCost); cout << G << endl; for(int i = 1000 - G / 2, j = 1; j <= G; i++, j++) { vectorRuta; int x = Children[j].City; Ruta.push_back(x); while(x > 1) { x = Oklenba[1][x]; Ruta.push_back(x); if(x == 1)break; } cout << i << ' ' << 1 << ' ' << Ruta.size() << endl; cout << Children[j].idx << endl; for(int k = Ruta.size() - 1; k >= 0; k--)cout << Ruta[k] << ' '; cout << endl; } } void Sortiraj() { } int main(){ Input(); JedanPoJedan(); return 0; }