#include<cstdio>
#include<queue>
#include<vector>
#include<map>
#include<functional>
#include<algorithm>

using namespace std;
typedef pair<int,int> P;
int n,m,p,a,b;
int t[20];
vector<P> G[35];
double dp[31][1<<8];

class data{
public:
	int v,bit;
	double cost;
	bool operator<(const data &d1)const{
		return d1.cost<cost;
	}
};

double dijk(){
	priority_queue<data> que;
	data ind;
	for(int i=0;i<=m;i++){
		for(int j=0;j<(1<<8);j++){
			dp[i][j]=-1.0;
		}
	}
	ind.v=a;
	ind.cost=0.0;
	ind.bit=0;
	que.push(ind);
	double res=-1.0;
	while(que.size()){
		data d=que.top();
		que.pop();
		if(dp[d.v][d.bit]!=-1.0 && dp[d.v][d.bit]<d.cost)continue;
		dp[d.v][d.bit]=d.cost;
		if(d.v==b){
			res=min(res,d.cost);
			if(res==-1.0)res=d.cost;
		}
		for(int i=0;i<G[d.v].size();i++){
			int nv=G[d.v][i].first,f=G[d.v][i].second;
			for(int j=0;j<n;j++){
				if(!((d.bit >> j) & 1)){
					int nbit=d.bit|(1<<j);
					if(dp[nv][nbit]>d.cost+(double)f/t[j] || dp[nv][nbit]==-1.0){
						dp[nv][nbit]=d.cost+(double)f/t[j];
						data nd;
						nd.v=nv;
						nd.bit=nbit;
						nd.cost=d.cost+(double)f/t[j];
						que.push(nd);
					}
				}
			}
		}
	}
	return res;
}

int main(void){
	while(1){
		scanf("%d %d %d %d %d",&n,&m,&p,&a,&b);
		if(n+m+p+a+b==0)break;
		for(int i=0;i<=m;i++){
			G[i].clear();
		}
		for(int i=0;i<n;i++){
			scanf("%d",&t[i]);
		}
		for(int i=0;i<p;i++){
			int x,y,z;
			scanf("%d %d %d",&x,&y,&z);
			G[x].push_back(P(y,z));
			G[y].push_back(P(x,z));
		}
		double res=dijk();
		if(res!=-1.0)printf("%.7f\n",dijk());
		else printf("Impossible\n");
	}
	return 0;
}