//編譯錯了兩次,原因:
abs(a),a不能是LL類型
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL inf=1e17;
const int num_e=2*1e6+10;
struct node
{
int v,next;
}e[num_e];
int head[num_e],cnt;
LL dp[num_e],a[num_e],ans=inf,sum;
int n;
void int_i(void)
{
memset(head,0,sizeof(head));
memset(dp,0,sizeof(dp));
cnt=0;
ans=inf;
sum=0;
return ;
}
void addedge(int u,int v)
{
e[++cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
return ;
}
void dfs(int u,int f)
{
LL m1=0,m2=0;
dp[u]=a[u];
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(v==f) continue;
dfs(v,u);
dp[u]+=dp[v];
m1=max(m1,dp[v]);
}
m2=max(m1,sum-dp[u]);
if(m2<ans)
{
ans=m2;
}
return;
}
int main()
{
int m,u,v,k;
k=0;
while(scanf("%d%d",&n,&m)&&(n||m))
{
int_i();
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
dfs(1,-1);
LL t=sum-2*ans;
if(t<0) t=-t;
printf("Case %d: %lld\n",++k,t);
}
return 0;
}