(http://acm.split.hdu.edu.cn/showproblem.php?pid=5883)
#include<bits/stdc++.h>
using namespace std;
int indeg[100001];
int a[100001],s[1000001],t[1000001];
int main()
{
int T;
scanf("%d",&T);
while(T>0)
{
T--;
int n,m;
scanf("%d%d",&n,&m);//n个顶点,m条边
int i,j;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(indeg,0,sizeof(indeg));
for(i=1;i<=m;i++)
{
scanf("%d%d",&s[i],&t[i]);
indeg[s[i]]++;
indeg[t[i]]++;//计算度数
}
int sum=0;
for(i=1;i<=n;i++)
sum+=indeg[i]%2;//计算奇度结点个数
if(sum>2)
printf("Impossible\n");
else
{
if(sum==0)//没有奇度结点,从该结点出则最后回到该结点
{
int ans=0;
for(i=1;i<=n;i++)//不管是哪条欧拉路径,都必须计算此步骤
{
for(j=1;j<=indeg[i]/2;j++)
ans^=a[i];
}
int maxx=0;
for(i=1;i<=n;i++)//枚举每个始结点,即最后回到该结点,所以还得计算一次
maxx=max(maxx,(ans^a[i]));
printf("%d\n",maxx);
}
else//两个奇度结点,一个进一个出,只有一条欧拉路径,所以不用比较最大值
{
int ans=0;
for(i=1;i<=n;i++)
{
if(indeg[i]%2==0)
{
for(j=1;j<=indeg[i]/2;j++)
ans^=a[i];
}
else
{
for(j=1;j<=indeg[i]/2+1;j++)
ans^=a[i];
}
}
printf("%d\n",ans);
}
}
}
return 0;
}