#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<ctime>

using std::vector;
using std::queue;
using std::priority_queue;

const long long INF=1ll<<60;

vector <int> e[2][200000];

long long dis1[2][200000];
long long dis2[2][200000];
int from[2][200000];

int in[200000];

struct po
{
	int no;
	long long v;
	po(){};
	po(int no,long long v):no(no),v(v){};
};
bool operator < (const po &fi,const po &se)
{
	return fi.v!=se.v?fi.v<se.v:fi.no<se.no;
}
priority_queue <po> pq;

int n,m;

struct edge
{
	int u,v,w;
};

edge r[400000];

void dij(int s,int o)
{
	while(!pq.empty())
		pq.pop();
	memset(in,0,sizeof(in));
	for(int i=1;i<=n;i++)
	{
		dis1[o][i]=dis2[o][i]=INF;
		from[o][i]=-1;
	}
	dis1[o][s]=0;
	pq.push(po(s,dis1[o][s]));
	while(!pq.empty())
	{
		int cur=pq.top().no;
		pq.pop();
		if(in[cur])
		{
			continue;
		}
		in[cur]=1;
		for(size_t i=0;i<e[o][cur].size();i++)
		{
			int w=e[o][cur][i];
			int t=r[w].v;
			long long v=dis1[o][cur]+r[w].w;
			if(v<=dis1[o][t])
			{
				if(v<dis1[o][t])
				{
					if(!in[t])
					{
						pq.push(po(t,-v));
					}
				}
				if(from[o][t]!=e[o][cur][i])
				{
					dis2[o][t]=dis1[o][t];
				}
				dis1[o][t]=v;
				from[o][t]=e[o][cur][i];
			}
			else if(v<dis2[o][t]&&e[o][cur][i]!=from[o][t])
			{
				dis2[o][t]=v;
			}
		}
	}
}

/*
void spfa(int s,int o)
{
	memset(in,0,sizeof(in));
	while(!pq.empty())
		pq.pop_front();
	for(int i=1;i<=n;i++)
	{
		dis1[o][i]=dis2[o][i]=INF;
		from[o][i]=-1;
	}
	pq.push_front(s);
	dis1[o][s]=0;
	while(!pq.empty())
	{
		int cur=pq.front();
		pq.pop_front();
		in[cur]=0;
		for(size_t i=0;i<e[o][cur].size();i++)
		{
			int t=r[e[o][cur][i]].v;
			long long v=(long long)r[e[o][cur][i]].w+dis1[o][cur];;
			if(v<=dis1[o][t])
			{
				if(from[o][t]!=e[o][cur][i])
				{
					dis2[o][t]=dis1[o][t];
				}
				dis1[o][t]=v;
				from[o][t]=e[o][cur][i];
				if(!in[t])
				{
					if(rand()&1)
						pq.push_back(t);
					else
						pq.push_front(t);
					in[t]=1;
				}
			}
			else if(v<dis2[o][t]&&e[o][cur][i]!=from[o][t])
			{
				dis2[o][t]=v;
			}
		}
	}
	return;
}
*/

long long dp[2][200000];
int deg[2][200000];
const long long MOD=19990523ll;

queue <int> q;
void bfs(int s,int o)
{
	while(!q.empty())
		q.pop();
	dp[o][s]=1;
	q.push(s);
	while(!q.empty())
	{
		int cur=q.front();
		q.pop();
		for(size_t i=0;i<e[o][cur].size();i++)
		{
			int w=e[o][cur][i];
			if(dis1[o][cur]+r[w].w==dis1[o][r[w].v])
			{
				deg[o][r[w].v]--;
				dp[o][r[w].v]=(dp[o][r[w].v]+dp[o][cur])%MOD;
				if(deg[o][r[w].v]==0)
				{
					q.push(r[w].v);
				}
			}
		}
	}
	return;
}

int main()
{
	srand(time(0));
#ifdef LYT_LOCAL
	freopen("f.in","r",stdin);
#endif
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int u,v,k;
		scanf("%d %d %d",&u,&v,&k);
		r[i].u=u;
		r[i].v=v;
		r[i].w=k;
		r[i+m].u=v;
		r[i+m].v=u;
		r[i+m].w=k;
		e[0][u].push_back(i);
		e[1][v].push_back(i+m);
	}
	dij(1,0);
	dij(2,1);
	for(int i=1;i<=m;i++)
	{
		if(dis1[0][r[i].u]+r[i].w==dis1[0][r[i].v])
			deg[0][r[i].v]++;
	}
	for(int i=m+1;i<=2*m;i++)
	{
		if(dis1[1][r[i].u]+r[i].w==dis1[1][r[i].v])
			deg[1][r[i].v]++;
	}
	bfs(1,0);
	bfs(2,1);
	long long ini=dis1[0][2];
	long long bi=dp[0][2];
	for(int i=1;i<=m;i++)
	{
		long long now=r[i].w;
		int u=r[i].u,v=r[i].v;
		if(i!=from[0][v])
		{
			now+=dis1[0][v];
		}
		else
		{
			now+=dis2[0][v];
		}
		if(i+m!=from[1][u])
		{
			now+=dis1[1][u];
		}
		else
		{
			now+=dis2[1][u];
		}
		if(now<ini)
		{
			puts("HAPPY");
		}
		else if(now==ini)
		{
			puts("SOSO");
		}
		else
		{
			if(dis1[0][r[i].u]+r[i].w+dis1[1][r[i].v]==ini&&dp[0][r[i].u]*dp[1][r[i].v]%MOD==bi)
			{
				puts("SAD");
			}
			else
			{
				puts("SOSO");
			}
		}
	}
	return 0;
}



Measured memory_bytes: 27688