#include #include #include #include #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; }