#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
//英语 看博友分析 抄博友程序 模拟未实现可能易理解 floyd实现 没掌握
//样例一与Figure-1相同 没掌握
int g[104][104];
double c[104];
int du[104];
int vis[104];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
cin>>n>>m;
memset(g,0,sizeof(g));
for(int i=0;i<104;i++)
{
g[i][i]=1;
}
memset(du,0,sizeof(du));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
cin>>c[i];
}
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
g[a][b]=g[b][a]=1;
du[a]++;
du[b]++;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(g[i][k]&& g[k][j])//抄博友程序
{
g[i][j]=1;
}
}
}
}
for(int i=1;i<=n;i++)//没掌握
{
if(vis[i])
{
continue;
}
vis[i]=1;//抄博友程序
double sum=0;
double num=0;
sum=sum+c[i];
num=num+du[i];
for(int j=1;j<=n;j++)
{
if(vis[j]==0 && g[i][j])
{
sum=sum+c[j];
num=num+du[j];
}
}
if(num==0)//抄博友程序
{
printf("%.3f\n",c[i]);
continue;
}
double p=sum/num;
printf("%.3f\n",p*du[i]);
for(int j=1;j<=n;j++)
{
if(vis[j]==0 && g[i][j])//如果是不是完全连通输出时 不是按1~n的顺序输出
{
printf("%.3f\n",p*du[j]);
vis[j]=1;//抄博友程序 位置
}
}
}
printf("\n");
}
return 0;
}