#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define aLL(g) (g).begin(),(g).end() #define REP(i, x, n) for(int i = x; i < n; i++) #define rep(i,n) REP(i,0,n) #define F(i,j,k) fill(i[0],i[0]+j*j,k) #define P(p) cout<<(p)< vi; typedef vector vl; typedef vector vd; typedef pair pii; typedef pair pll; typedef long long ll; int dx[] = { 0, 1, 0, -1 }; int dy[] = { -1, 0, 1, 0 }; int sttoi(std::string str) { int ret; std::stringstream ss; ss << str; ss >> ret; return ret; } bool sort_greater(const pair &a, const pair &b) { return a.second > b.second; } void solve() { int n, m, k; cin >> n >> m >> k; vector v[101][101]; bool visited[1001][101]; rep(i,1001){ rep(j, 101){ visited[i][j] = false; } } int way[1000]; rep(i, m){ int a, b, c; cin >> a >> b >> c; v[a][b].push_back(c); v[b][a].push_back(c); } int d; cin >> d; rep(x, 101)rep(y, 101){ if (!v[x][y].empty()){ for (int z = 0; z < v[x][y].size();z++){ if (v[x][y][z] == d){ visited[1][y] = true; } } } } for (int i = 2; i <= k; i++){ cin >> d; rep(j, 101){ if (visited[i - 1][j]){ rep(l, 101){ if (!v[j][l].empty()){ for (int z = 0; z < v[j][l].size(); z++){ if (v[j][l][z] == d){ visited[i][l] = true; } } } } } } } int count = 0; queue q; rep(i, 101){ if (visited[k][i]){ count++; q.push(i); } } P(count); while (!q.empty()){ cout << q.front(); q.pop(); if (!q.empty()){ cout << " "; } } P(""); } int main() { solve(); return 0; }