#include<cstdio>
int N,M;
struct edge{int to;edge*next;}E[400010],*ne=E,*first[100010];
void link(int u,int v){*ne=(edge){v,first[u]};first[u]=ne++;}
bool vis[100010],col[100010];
int tot;
bool dfs(int i){
	vis[i]=1;++tot;
	bool r=1;
	for(edge*e=first[i];e;e=e->next){
		if(!vis[e->to])col[e->to]=!col[i],r|=dfs(e->to);
		else if(col[e->to]==col[i])r=0;
	}
	return r;
}
int main(){
	scanf("%d%d",&N,&M);
	for(int i=0,u,v;i<M;i++)scanf("%d%d",&u,&v),link(u,v),link(v,u);
	int a=0,b=0,s=0;
	for(int i=1;i<=N;i++)if(!vis[i]){
		int o=tot;
		if(dfs(i))(o=tot-o)>1?++a:++s;
		else++b;
	}
	long long ans=(2ll*N-s)*s+(a+b)*1ll*(a+b)+1ll*a*a;
	printf("%lld\n",ans);
}