/*
* POJ_2236.cpp
*
* Created on: 2013年11月5日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1010;
int father[maxn];//用来维护父子关系,如father[a] = b 表示a的父亲是b
int x[maxn];
int y[maxn];
bool valid[maxn];//valid[i] = true ,表示某一个节点已经修复
//并查集的查询操作
int find(int a){
if(father[a] == a){
return a;
}
return (father[a] = find(father[a]));
}
//并查集的合并操作
void join(int p,int q){
p = find(p);
q = find(q);
if(p != q){
father[p] = q;
}
}
int main(){
int n,d;
while(scanf("%d%d",&n,&d)!=EOF){
memset(valid,false,sizeof(valid));
int i;
for(i = 1 ; i <= n ; ++i){
father[i] = i;
}
for(i = 1 ; i <= n ; ++i){
scanf("%d%d",&x[i],&y[i]);
}
char str[10];
while(scanf("%s",str)!=EOF){
if(str[0] == 'O'){
int p;
scanf("%d",&p);
valid[p] = true;
for(i = 1 ; i <= n ; ++i){//每修复一个节点,都尝试着将这个节点连入已经连好的网络之中
if(valid[i] && ((x[i]-x[p])*(x[i]-x[p])+(y[i]-y[p])*(y[i]-y[p]) <= d*d) ){
join(i,p);
}
}
}else if(str[0] == 'S'){
int a,b;
scanf("%d%d",&a,&b);
if(find(a) != find(b)){
printf("FAIL\n");
}else{
printf("SUCCESS\n");
}
}
}
}
return 0;
}