#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define MAXN 1000010
#define LL long long
const LL INF = 0x7fffffffffffff;
using namespace std;
typedef struct{
int to,next;
}Node;
Node edge[2*MAXN];
int vis[MAXN/10],head[MAXN/10],val[MAXN/10];
LL sum[MAXN/10],all_sum,ans;
LL My_abs(LL tmp){return tmp < 0 ? -tmp : tmp;}
void addedge(int u,int v,int k){
edge[k].to = v;
edge[k].next = head[u];
head[u] = k;
}
LL dfs_sum(int s){
vis[s] = 1;
sum[s] = val[s];
for(int i = head[s];~i;i = edge[i].next){
int u = edge[i].to;
if(!vis[u]) sum[s] += dfs_sum(u);
}
return sum[s];
}
void dfs_minabs(int s){
vis[s]= 1;
for(int i = head[s];~i;i = edge[i].next){
int u = edge[i].to;
if(!vis[u]){
dfs_minabs(u);
ans = min(ans,My_abs(all_sum - 2*sum[u]));
}
}
}
int main(){
int n,m,cas = 0;
freopen("in.c","r",stdin);
while(~scanf("%d%d",&n,&m) && (m+n) ){
int k = 1,tmp,u,v;
all_sum = 0;
for(int i = 1;i <= n;i ++) scanf("%d",&tmp),val[i] = tmp,all_sum += tmp;
memset(head,-1,sizeof(head));
for(int i = 0;i < m;i ++){
scanf("%d%d",&u,&v);
addedge(u,v,k++);
addedge(v,u,k++);
}
memset(vis,0,sizeof(vis));
dfs_sum(1);
ans = INF;
memset(vis,0,sizeof(vis));
dfs_minabs(1);
if(n == 1) ans = val[1];
printf("Case %d: %lld\n",++cas,ans);
}
return 0;
}