#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k,a,b,val[200000],sig1[200000],pad[200000];
ll solve2[200000];
vector<int> graph[200000];
ll dfs1(int node,int ante){
ll maxi=0;
for(auto u:graph[node]){
if(u==ante)continue;
pad[u]=node;
ll temp=dfs1(u,node);
if(temp>maxi){
maxi=temp;
sig1[node]=u;
}
}
if(maxi==0)sig1[node]=node;
return val[node]+maxi;
}
ll resfinal2;
vector<int> res2,temp2;
void dfs2(int node,int ante,bool dearriba){
ll maxi=0;
for(auto u:graph[node]){
if(u==ante)continue;
dfs2(u,node,!dearriba);
maxi=max(maxi,solve2[u]-val[u]);
solve2[node]+=val[u];
}
//solve2=suma de todo directamente y
solve2[node]+=maxi;
resfinal2=max(resfinal2,solve2[node]);
}
void solveraiz(int node,int ante){
// usar dos caminos distintos;
vector<int> nums;
for(auto u:graph[node]){
if(u==ante)continue;
}
dfs2(node,ante,true);
}
int condis=0;
ll suma3;
vector<int> res3;
void dfs3(int node,int ante){
bool xd=false;
if(condis==3){
res3.push_back(node);
suma3+=val[node];
condis=0;
xd=true;
}
for(auto u:graph[node]){
if(u==ante)continue;
condis++;
dfs3(u,node);
}
if(!xd){
condis=0;
suma3+=val[node];
res3.push_back(node);
}
condis++;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n >> k;
for(int i=1;i<n;i++){
cin >> a >> b;
graph[--a].push_back(--b);
graph[b].push_back(a);
}
for(int i=0;i<n;i++)cin >> val[i];
if(k==1){
cout << dfs1(0,-1) << '\n';
vector<int> res;
int now=0;
while(now!=sig1[now]){
res.push_back(now);
now=sig1[now];
}
res.push_back(now);
cout << res.size() << '\n';
for(auto u:res)cout << u+1 << ' ';
return 0;
}else if(k==2){
// toda distancia impar es primero hijo luego nodo
// toda distancia par es nodo luego hijo
// pueden decidir volver o no
// op1 elegir un camino recto y sumar los que estan a distancia <=1 de ese camino
// para comprobar mi teoria
solveraiz(0,-1);
}else{
condis=3;
dfs3(0,-1);
cout << suma3 << '\n';
cout << res3.size() << '\n';
for(auto u:res3)cout << u+1 << ' ';
}
}