#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+5;
int n, m, s;
bool inQueue[N];
vector<pair<int,int> > edges[N];
inline ll read(){
ll x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
typedef pair<int, int> pii;
int dis[105],cnt[105];
priority_queue<pii> Q;
signed main(){
cin>>n>>m;
s=1;
memset(dis,0x3f,sizeof(dis));
for(int i=0,u,v, w; i< m; i++){
cin>>u>>v;
w=1;
edges[u].emplace_back(v, w);
edges[v].emplace_back(u, w);
}
memset(dis,0x3f,sizeof(dis));
dis[s]= 0;
Q.push({0,s});
while(!Q.empty()){
pii info = Q.top();
Q.pop();
int x= info.second;
if(dis[x]!= info.first)
continue;
for(auto e:edges[x]){
if(dis[e.first]<= dis[x]+ e.second)
continue;
dis[e.first]= dis[x]+ e.second;
Q.push({dis[e.first],e.first});
}
}
int ans=0,yi=0;
for(int i=1;i<=n;i++){
if(dis[i]<0x3f3f3f3f){
if(ans<dis[i]){
yi=i;
ans=dis[i];
cnt[dis[i]]=1;
}
else{
cnt[ans]++;
}
}
}
cout<<yi<<' '<<ans<<' '<<cnt[ans];
return 0;
}