Problem: Natsume loves big cats. One day, Natsume was invited by the stray cats she was always close to to go to the mysterious bookstore where the cats were open. When I heard that the bookstore sells books with many pictures of cats, Natsume decided to follow her happily.

I didn't know Natsume, but the bookstore that was taken by the cats was a famous store with chain stores nationwide. The store has a solid manual for the clerk, and the behavior of the clerk is unified in every store. The following is an excerpt from the manual.

1. When a customer enters the store through a door within a 10-Euclidean distance from the clerk, he must say "Welcome Hello" in a loud voice for X seconds.
2. When the clerk who heard another clerk within the Euclidean distance of 50 saying "Welcome Hello", the clerk said "Welcome Hello" at the end of the utterance of "Welcome Hello" in a loud voice over X seconds. Must. However, a clerk who has completed uttering another "Welcome Hello" within the past Y seconds from the start of uttering this repeat must not repeat it.



Given the X, Y, customer location, and clerk placement, calculate how many seconds it will take for the store to be quiet after the customer enters. If the repeat does not stop, print "You're always welcome!".

Notes on Submission

Multiple datasets are given in the above format. The first line of input data gives the number of datasets. Create a program that outputs the output for each data set in order in the above format.



Input

The number N of the clerk and the X and Y written in the manual are given on the first line of the input, separated by one space character. The second line is the position where Natsume enters the store, and the following N lines are the coordinates representing the positions of N clerk. Each position is given by separating the x and y coordinates with a single space character, and each number is given as an integer between 0 and 1000. Also, 1 <= N <= 1000, 1 <= X, Y <= 100 is satisfied.

Output

If the repeat does not stop, output the time from when the customer enters the store until it becomes quiet, and if it does not stop, output "You're always welcome!" On one line.

Example

Input

4
3 3 5
0 0
10 0
40 40
40 90
4 5 10
100 100
50 100
50 150
100 50
100 150
4 60 10
100 100
90 100
110 100
100 90
100 110
4 60 10
100 100
80 100
110 100
100 80
100 110


Output

9
0
60
You're always welcome!

Solution (in JAVA):

Solution:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for(int t=0;t<T;t++) {
			int n = sc.nextInt();
			int x = sc.nextInt();
			int y = sc.nextInt();
			Vector2[] v = new Vector2[n+1];
			for(int i=0;i<=n;i++) {
				v[i] = new Vector2(sc.nextInt(), sc.nextInt());
			}
			Graph g = new Graph(n+1);
			UnionFind uf = new UnionFind(n+1);
			int count = 0;
			for(int i=1;i<=n;i++) {
				if (Vector2.distSquare(v[i], v[0]) <= 100) {
					g.addBidirectionalEdge(i, 0, 1);
					uf.union(i, 0);
					count++;
				}
				for(int j=i+1;j<=n;j++) {
					if (Vector2.distSquare(v[i], v[j]) <= 2500) {
						g.addBidirectionalEdge(i, j, 1);
						uf.union(i, j);
					}
				}
			}
			//System.out.println(g);
			if (y < x && uf.size(0) >= 3 && uf.size(0) != count + 1) {
				System.out.println("You're always welcome!");
				continue;
			}

			int[] dist = g.minDistQueue(0);
			int max = 0;
			for(int i=0;i<=n;i++) {
				if (dist[i] < Graph.INF) {
					max = Math.max(max,dist[i]);
				}
			}
			System.out.println(x * max);

			System.gc();
		}
	}

}
class Graph {
	public static final int INF = 1<<29;
	int n;
	ArrayList<Edge>[] graph;

	@SuppressWarnings("unchecked")
	public Graph(int n) {
		this.n = n;
		this.graph = new ArrayList[n];
		for(int i=0;i<n;i++) {
			graph[i] = new ArrayList<Edge>();
		}
	}

	public void addBidirectionalEdge(int from,int to,int cost) {
		addEdge(from,to,cost);
		addEdge(to,from,cost);
	}
	public void addEdge(int from,int to,int cost) {
		graph[from].add(new Edge(to, cost));
	}

	//O(E) all cost is 0 or 1
	public int[] minDistQueue(int s) {
		int[] d = new int[n];
		Arrays.fill(d, INF);
		ArrayDeque<Integer> q = new ArrayDeque<Integer>();
		q.add(s);
		d[s] = 0;
		while(!q.isEmpty()) {
			int v = q.pollFirst();
			for(Edge e:graph[v]) {
				int u = e.to;
				if (d[v] + e.cost < d[u]) {
					d[u] = d[v] + e.cost;
					if (e.cost == 0) {
						q.addFirst(u);
					}else{
						q.addLast(u);
					}
				}
			}
		}
		return d;
	}

	class Edge {
		int to;
		int cost;
		public Edge(int to,int cost) {
			this.to = to;
			this.cost = cost;
		}
		public String toString() {
			return String.valueOf(to);
		}
	}
	public String toString() {
		return Arrays.toString(graph);
	}
}
class UnionFind {
	private int[] data;
	public UnionFind(int size) {
		data = new int[size];
		Arrays.fill(data, -1);
	}
	public void union(int x,int y) {
		x = root(x);
		y = root(y);
		if (x!=y) {
			if (data[y] < data[x]) {
				int tmp = y;
				y = x;
				x = tmp;
			}
			data[x] += data[y];
			data[y] = x;
		}
	}
	public boolean isConnected(int x,int y) {
		return root(x)==root(y);
	}
	private int root(int x) {
		return data[x] < 0 ? x : (data[x] = root(data[x]));
	}
	public int size(int x) {
		return -data[root(x)];
	}
	public String toString() {
		return Arrays.toString(data);
	}
}
class Vector2 {
	int x = 0;
	int y = 0;
	public Vector2(int x,int y) {
		this.x = x;
		this.y = y;
	}
	public Vector2 subtract(Vector2 v) {
		return new Vector2(this.x-v.x,this.y-v.y);
	}
	public int distSquare() {
		return x * x + y * y;
	}
	public static int distSquare(Vector2 a,Vector2 b) {
		return a.subtract(b).distSquare();
	}
	public String toString() {
		return this.x + " " + this.y;
	}
}