#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;
#define INF (static_cast<int>(1e9))
#define endl '\n'
typedef pair<int, int> PAIR;
int main(void) {
ios::sync_with_stdio(false);
int N, M; cin >> N >> M;
int J; cin >> J; J--;
int K; cin >> K;
map<int, char> house;
for (int i = 0; i < 2; i++) {//p번째 집이 어떤집인지 저장해요
for (int k = 0; k < K; k++) {
int p; cin >> p;
house.insert(make_pair(p - 1, 'A' + i));
}
}
vector<vector<PAIR>> graph(N);
for (int i = 0; i < M; i++) {
int X, Y, Z; cin >> X >> Y >> Z;
graph[X - 1].push_back(PAIR(Y - 1, Z));
graph[Y - 1].push_back(PAIR(X - 1, Z));
}//그래프도 양방향 그래프더라구요..
vector<bool> visited(N, false);
vector<int> cost(N, INF);
priority_queue<PAIR, vector<PAIR>, greater<PAIR>> pq;
pq.push(PAIR(0, J));
cost[J] = 0;
while (!pq.empty()) {//다익스트라 알고리즘요
int cur;
do {
cur = pq.top().second; pq.pop();
} while (!pq.empty() && visited[cur]);
if (visited[cur]) break;
visited[cur] = true;
for (auto& i : graph[cur]) {
int next = i.first, distance = i.second;
if (cost[next] > cost[cur] + distance) {
cost[next] = cost[cur] + distance;
pq.push(PAIR(cost[next], next));
}
}
}
int minimum[2] = { INF, INF };//A,B의 최솟값을 저장해요
for (int i = 0; i < N; i++) {
if (house[i] == 'A') {//A집일 경우
minimum[0] = min(minimum[0], cost[i]);
}
else if (house[i] == 'B') {//B집일 경우
minimum[1] = min(minimum[1], cost[i]);
}
}
if (minimum[0] != INF || minimum[1] != INF) {//둘중 한값이라도 있으면
cout << (minimum[0] > minimum[1] ? 'B' : 'A') << endl;
//A,B에서 작은걸 출력하구요 값이 같아도.. A를 출력하는..
cout << min(minimum[0], minimum[1]) << endl;
//최솟값 출력해요..
}
else cout << (-1) << endl;//둘다 값이 없으면.. -1
return 0;
}