#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
using namespace std;
#define ll long long
int dss[210],dis[210],head[210],vis[210],sum[210],cycle[210],s=0;
const int inf=0x3f3f3f3f;
int n,m,tot;
queue<int>que;
struct gg
{
int to,time,next;
}g[500000];
void add(int x,int y,int z)
{
g[++tot].to=y;
g[tot].next=head[x];
g[tot].time=z;
head[x]=tot;
}
void spfa()
{
while(!que.empty())
que.pop();
dis[1]=0;
vis[1]=1;
que.push(1);
while(!que.empty())
{
int v=que.front();
que.pop();
vis[v]=0;
for(int i=head[v];i!=-1;i=g[i].next)
{
int to=g[i].to,time=g[i].time;
if(cycle[to])continue;
if(dis[to]>dis[v]+g[i].time)
{
dis[to]=dis[v]+time;
if(!vis[to])
{
vis[to]=1;
que.push(to);
sum[to]++;
}
if(sum[to]>=n)cycle[to]=1;
}
}
}
}
void solve()
{
tot=0;
memset(dis,inf,sizeof(dis));
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
memset(sum,0,sizeof(sum));
memset(cycle,0,sizeof(cycle));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&dss[i]);
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int x,y,z;
scanf("%d%d",&x,&y);
z=(dss[y]-dss[x])*(dss[y]-dss[x])*(dss[y]-dss[x]);
add(x,y,z);
}
spfa();
scanf("%d",&m);
int o;
printf("Case %d:\n",s);
for(int i=1;i<=m;i++)
{ scanf("%d",&o);
if(dis[o]<3||cycle[o]||dis[o]==inf)printf("?");
else printf("%d",dis[o]);
if(i!=m)printf("\n");
}
printf("\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{s++;
solve();}
}