#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#define INF (1e9)
#define N 9
#define M 31
using namespace std;
typedef pair<int,int> P0;
typedef pair<double,P0> P;
void NP(int);
double dijkstra();
int np[N],used[N+1],n,m,p,a,b,ti[N];
double d[M],ans;
vector<P0> edge[M];
 
int main(){
  int x,y,z;
  while(1){
    cin>>n>>m>>p>>a>>b;
    if(!n&&!m&&!p&&!a&&!b) break;
    for(int i=0;i<n;i++) cin>>ti[i];
    a--,b--;
    while(p--){
      cin>>x>>y>>z;
      x--,y--;
      edge[x].push_back(P0(y,z));
      edge[y].push_back(P0(x,z));
    }
    ans=INF;
    NP(0);
    if(ans==INF) cout<<"Impossible"<<endl;
    else cout<<ans<<endl;
    for(int i=0;i<m;i++) edge[i].clear();
  }
  return 0;
}
 
 
void NP(int x){
  if(x==n){
    ans=min(ans,dijkstra());
    return ;
  }
  for(int i=0;i<n;i++){
    if(used[i]) continue;
    used[i]=true;
    np[x]=i;
    NP(x+1);
    used[i]=false;
  }
}


double dijkstra(){
  priority_queue<P,vector<P>,greater<P> > q;
  for(int i=0;i<m;i++) d[i]=INF;
  q.push(P(0,P0(0,a)));

  while(!q.empty()){
    P t=q.top(); q.pop();
    double dis=t.first;
    int idx=t.second.first,pos=t.second.second;
    if(pos==b)return dis;
    if(d[pos]<dis||idx==n)continue;
    for(int i=0;i<edge[pos].size();i++){
      double ndis=dis+(1.0*edge[pos][i].second/ti[np[idx]]);
      int npos=edge[pos][i].first;
      if(d[npos]>ndis) q.push(P(ndis,P0(idx+1,npos))),d[npos]=ndis;
    }
  }
  return INF;
}